iOS開發(fā)-iCloud的簡單使用(2)-Documents數據的使用

上次說到了iCloud的簡單配置和key-value類型的簡單使用视事,這次我們來看一下另外一種類型Documents類型的使用胆萧。

相較于key-value的存儲類型,Documents是用來管理一些比較大的文件俐东,比如用戶創(chuàng)建的文檔等等跌穗。

基本概念

iCloud Entitlements

在我們打開iCloud選項的時候,系統(tǒng)就是自動為我們添加一個 xxx.entitlements的文件犬性,這個東西用來保證應用的安全性瞻离,確保只有你的應用才能訪問你自己創(chuàng)建的文檔腾仅,系統(tǒng)也是依賴于他來區(qū)分用戶的iCloud賬戶中每個應用的文檔乒裆。

查看這個xxx.entitlements我們會發(fā)現在他里邊有這樣的一個keyUbiquity Container Identifiers,對應的value為iCloud.$(CFBundleIdentifier)推励。其實這個$(CFBundleIdentifier)就代表這你的APP ID鹤耍。所以也可以看成是iCloud.com.zzr.ZZRiCloudDemo

NSFileManager

NSFileManager主要是對文件的操作验辞,我們用它來獲取iCloud的存儲地址稿黄。

根據我們的entitlements,通過NSFileManager就可以獲得iCloud的存儲地址跌造,在獲取地址之后杆怕,我們要先判斷一下獲取的地址是否為空族购,如果這個地址為空,則說明用戶的iCloud暫時不可用陵珍,接下來一切的操作都沒辦法進行下去。

//獲取地址

+ (NSURL *)getUbiquityContauneURLWithFileName:(NSString *)fileName

{

 NSURL *ubiquityURL = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:UbiquityContainerIdentifiers];

 //驗證iCloud是否可用

 if(!ubiquityURL)

 {

 NSLog(@"尚未開啟iCloud功能");

 return nil;

 }

 NSURL *URLWithFileName = [ubiquityURL URLByAppendingPathComponent:@"Documents"];

 URLWithFileName = [URLWithFileName URLByAppendingPathComponent:fileName];

 return URLWithFileName;

}

UIDocument

UIDocument主要是用于對文件內容的操作互纯。

其實獲取了文件的地址之后瑟幕,我們已經可以直接對文件進行操作了只盹,但是官方還是讓我們通過UIDocument來操作殖卑,因為當我們在對iCloud進行操作的時候懦鼠,不止是只有我們自己對他進行操作肛冶,iCloud daemon也會對iCloud操作,用UIDocument操作能夠保證存取安全荣刑。

在使用UIDocument之前馅笙,我們新建一個類,繼承于UIDocument厉亏,并且重寫兩個方法:


- (BOOL)loadFromContents:(id)contents ofType:(NSString *)typeName error:(NSError * _Nullable __autoreleasing *)outError

{

 self.myData = [contents copy];

 return YES;

}

- (nullable id)contentsForType:(NSString *)typeName error:(NSError * _Nullable __autoreleasing *)outError

{

 if(!self.myData)

 {

 self.myData = [[NSData alloc] init];

 }

 return self.myData;

}

NSMetadataQuery

NSMetadataQuery主要用來查詢數據董习。

增刪改查

創(chuàng)建文檔

有了之前的準備工作,創(chuàng)建一個文檔就非常簡單了爱只,只要創(chuàng)建好我們要保存的文件皿淋,通過


- (void)saveToURL:(NSURL *)url forSaveOperation:(UIDocumentSaveOperation)saveOperation completionHandler:(void (^ __nullable)(BOOL success))completionHandler __TVOS_PROHIBITED;

就可以將文檔上傳到iCloud中了。

我們以一個txt文件作為示范恬试。


//創(chuàng)建文檔

+ (void)createDocument

{

 NSString *fileName = @"test.txt";

 NSURL *url = [iCloudHandle getUbiquityContauneURLWithFileName:fileName];

 ZZRDocument *doc = [[ZZRDocument alloc] initWithFileURL:url];

 NSString *docContent = @"iCloud Document 測試數據";

 doc.myData = [docContent dataUsingEncoding:NSUTF8StringEncoding];

 [doc saveToURL:url forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {

 if(success)

 {

 NSLog(@"創(chuàng)建文檔成功");

 }

 else

 {

 NSLog(@"創(chuàng)建文檔失敗");

 }

 }];

}

修改文檔

修改文檔窝趣,其實就是重寫文檔,就是將上邊創(chuàng)建文檔中的UIDocumentSaveForCreating改為UIDocumentSaveForOverwriting训柴。


//修改文檔 實際上是overwrite重寫

+ (void)overwriteDocument

{

 NSString *fileName = @"test.txt";

 NSURL *url = [iCloudHandle getUbiquityContauneURLWithFileName:fileName];

 ZZRDocument *doc = [[ZZRDocument alloc] initWithFileURL:url];

 NSString *docContent = @"iCloud Document 修改數據";

 doc.myData = [docContent dataUsingEncoding:NSUTF8StringEncoding];

 [doc saveToURL:url forSaveOperation:UIDocumentSaveForOverwriting completionHandler:^(BOOL success) {

 if(success)

 {

 NSLog(@"修改文檔成功");

 }

 else

 {

 NSLog(@"修改文檔失敗");

 }

 }];

}

刪除文檔

刪除文檔其實就是通過之前的地址獲取到文件哑舒,然后調用remove方法即可。


//刪除文檔

+ (void)removeDocument

{

 NSString *fileName = @"test.txt";

 NSURL *url = [iCloudHandle getUbiquityContauneURLWithFileName:fileName];

 NSError *error;

 [[NSFileManager defaultManager] removeItemAtURL:url error:&error];

 if(error)

 {

 NSLog(@"刪除文檔失敗 %@",error);

 }

 else

 {

 NSLog(@"刪除文檔成功");

 }

}

查詢文檔

之前講了增加幻馁、刪除洗鸵、修改越锈,好像增刪改查中只剩下查詢這個方法沒有介紹了。查詢和前邊幾個有點不同膘滨,他需要用到NSMetadataQuery瞪浸。


//獲取最新的數據

+ (void)getNewDocument:(NSMetadataQuery *)myMetadataQuery

{

 [myMetadataQuery setSearchScopes:@[NSMetadataQueryUbiquitousDocumentsScope]];

 [myMetadataQuery startQuery];

}

直接調用startQuery開始查詢,iCloud就已經開始幫我們查詢了吏祸,查詢好之后对蒲,iCloud會通過通知來告訴我們查詢到了東西。

所以我們注冊兩個通知


 //獲取最新數據完成

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(finishedGetNewDocument:) name:NSMetadataQueryDidFinishGatheringNotification object:self.myMetadataQuery];

 //數據更新通知

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(documentDidChange:) name:NSMetadataQueryDidUpdateNotification object:self.myMetadataQuery];

并相應他們


- (void)finishedGetNewDocument:(NSMetadataQuery *)metadataQuery

{

 NSArray *item =self.myMetadataQuery.results;

 [item enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {

 NSMetadataItem *item = obj;

 //獲取文件名

 NSString *fileName = [item valueForAttribute:NSMetadataItemFSNameKey];

 //獲取文件創(chuàng)建日期

 NSDate *date = [item valueForAttribute:NSMetadataItemFSContentChangeDateKey];

 NSLog(@"%@,%@",fileName,date);

 ZZRDocument *doc = [[ZZRDocument alloc] initWithFileURL:[iCloudHandle getUbiquityContauneURLWithFileName:fileName]];

 [doc openWithCompletionHandler:^(BOOL success) {

 if(success)

 {

 NSLog(@"讀取數據成功贡翘。");

 NSString *docConten = [[NSString alloc] initWithData:doc.myData encoding:NSUTF8StringEncoding];

 NSLog(@"%@",docConten);

 }

 }];

 }];

}

- (void)documentDidChange:(NSMetadataQuery *)metadataQuery

{

 NSLog(@"Document 數據更新");

}

其中


NSArray *item =self.myMetadataQuery.results;

就是查詢到的內容的數組蹈矮,遍歷他,就可以獲取到對應目錄下的全部文件了鸣驱。

Demo

先放一下demo的地址泛鸟。

demo簡單的制作了一個text文檔的存儲功能,一些交互沒有完善踊东,但是基本的增刪改查功能都已經實現了北滥。

DocumentDemo.gif

以上就是iCloud Document的簡單使用。此文章僅供個人學習使用闸翅,如有不當再芋,希望大佬指出。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末坚冀,一起剝皮案震驚了整個濱河市济赎,隨后出現的幾起案子,更是在濱河造成了極大的恐慌记某,老刑警劉巖司训,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異液南,居然都是意外死亡壳猜,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門滑凉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來统扳,“玉大人,你說我怎么就攤上這事譬涡∩劣模” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵涡匀,是天一觀的道長。 經常有香客問我溉知,道長陨瘩,這世上最難降的妖魔是什么腕够? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮舌劳,結果婚禮上帚湘,老公的妹妹穿的比我還像新娘。我一直安慰自己甚淡,他們只是感情好大诸,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著贯卦,像睡著了一般资柔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上撵割,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天贿堰,我揣著相機與錄音,去河邊找鬼啡彬。 笑死羹与,一個胖子當著我的面吹牛,可吹牛的內容都是我干的庶灿。 我是一名探鬼主播纵搁,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼往踢!你這毒婦竟也來了诡渴?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤菲语,失蹤者是張志新(化名)和其女友劉穎妄辩,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體山上,經...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡眼耀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了佩憾。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哮伟。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖妄帘,靈堂內的尸體忽然破棺而出楞黄,到底是詐尸還是另有隱情,我是刑警寧澤抡驼,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布鬼廓,位于F島的核電站,受9級特大地震影響致盟,放射性物質發(fā)生泄漏碎税。R本人自食惡果不足惜尤慰,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望雷蹂。 院中可真熱鬧伟端,春花似錦、人聲如沸匪煌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽萎庭。三九已至霜医,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間擎椰,已是汗流浹背支子。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留达舒,地道東北人值朋。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像巩搏,于是被迫代替她去往敵國和親昨登。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內容