上次说到了iCloud的简单配置和key-value类型的简单使用,这次我们来看一下另外一种类型 相较于key-value的存储类型, 基本概念iCloud Entitlements在我们打开iCloud选项的时候,系统就是自动为我们添加一个 查看这个 NSFileManager
根据我们的entitlements,通过 //获取地址+ (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
其实获取了文件的地址之后,我们已经可以直接对文件进行操作了,但是官方还是让我们通过 在使用 - (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
增删改查创建文档有了之前的准备工作,创建一个文档就非常简单了,只要创建好我们要保存的文件,通过 - (void)saveToURL:(NSURL *)url forSaveOperation:(UIDocumentSaveOperation)saveOperation completionHandler:(void (^ __nullable)(BOOL success))completionHandler __TVOS_PROHIBITED; 就可以将文档上传到iCloud中了。 我们以一个txt文件作为示范。 //创建文档+ (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(@"创建文档成功"); } else { NSLog(@"创建文档失败"); } }]; } 修改文档修改文档,其实就是重写文档,就是将上边创建文档中的 //修改文档 实际上是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(@"删除文档成功"); } } 查询文档之前讲了增加、删除、修改,好像增删改查中只剩下查询这个方法没有介绍了。查询和前边几个有点不同,他需要用到 //获取最新的数据+ (void)getNewDocument:(NSMetadataQuery *)myMetadataQuery { [myMetadataQuery setSearchScopes:@[NSMetadataQueryUbiquitousDocumentsScope]]; [myMetadataQuery startQuery]; } 直接调用 所以我们注册两个通知 //获取最新数据完成 [[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]; //获取文件创建日期 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 以上就是 |
|