我一直在努力将icloud添加到我的项目中(这在包子中很痛苦),我可以保存和移除文件,但是我无法获得存储在iCloud中的文件。我试过了大约10个不同网站的解决方案(包括Apple文档)。每当我打电话给[self.query startQuery];
,一切似乎都在起作用:调用正确的方法,这些方法的执行完全按照它们的方式执行。然后,当我要求我的应用的iCloud Documents目录中的文件有nsarray时,我得到两个圆括号(当我在NSLog中查看时):File List: ()
。我知道在我的应用程序的iCloud Documents目录中有很多不同的文档,包括所有形状,扩展名,大小和名称,因为我一直在使用iCloud Developer网站来检查是否正常工作。我的设置第一种方法查询如下:iCloud NSMetadata查询结果为空
- (void)syncWithCloud {
self.query = [[NSMetadataQuery alloc] init];
NSURL *mobileDocumentsDirectoryURL = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];
[query setSearchScopes:[NSArray arrayWithObjects:NSMetadataQueryUbiquitousDocumentsScope, nil]];
//[query setPredicate:[NSPredicate predicateWithFormat:@"%K LIKE '*'", NSMetadataItemFSNameKey]];
[query setPredicate:[NSPredicate predicateWithFormat:[NSString stringWithFormat:@"%%K like \"%@*\"", [mobileDocumentsDirectoryURL path]], NSMetadataItemPathKey]];
//Pull a list of all the Documents in The Cloud
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(processFiles:)
name:NSMetadataQueryDidFinishGatheringNotification object:self.query];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(processFiles:)
name:NSMetadataQueryDidUpdateNotification object:self.query];
[self.query startQuery];
}
由苹果公司提供的process files method是下一个:
- (void)processFiles:(NSNotification*)aNotification {
NSMutableArray *discoveredFiles = [NSMutableArray array];
//Always disable updates while processing results.
[query disableUpdates];
//The query reports all files found, every time.
NSArray *queryResults = [query results];
for (NSMetadataItem *result in queryResults) {
NSURL *fileURL = [result valueForAttribute:NSMetadataItemURLKey];
NSNumber *aBool = nil;
// Don't include hidden files.
[fileURL getResourceValue:&aBool forKey:NSURLIsHiddenKey error:nil];
if (aBool && ![aBool boolValue])
[discoveredFiles addObject:fileURL];
}
//Update the list of documents.
[FileList removeAllObjects];
[FileList addObjectsFromArray:discoveredFiles];
//[self.tableView reloadData];
//Reenable query updates.
[query enableUpdates];
NSLog(@"File List: %@", FileList);
}
为什么没有这个给我的文件列表,或至少某种数据?我是否定义了NSMetadata查询错误,也许我的谓词没有格式化?我知道我做错了什么,因为没有办法让iCloud变得这么复杂(或者可以吗?)。
感谢您的帮助!
编辑#1:我正在继续尝试不同的方法来解决这个问题。使用其中一个答案下面我已经改变了谓词滤波器如下:
[query setPredicate:[NSPredicate predicateWithFormat:@"NSMetadataItemFSNameKey LIKE '*'"]];
我加以下行之前[query enableUpdates]
呼叫:
for (NSMetadataItem *item in query.results) {
[FileList addObject:[item valueForAttribute:NSMetadataItemFSNameKey]];
}
在processFiles
方法,我已经尝试将所有代码放在后台线程上,但这没什么区别 - 事实上,当代码不在后台线程上执行时FileList
会给我这个(null)
而不是这个()
。
难道我的问题与线程管理或内存分配有关吗?请注意,我正在使用ARC。
编辑#2:FileList
变量是一个NSMutableArray在我@interface
定义并在-(id)init
方法初始化调用processFiles
方法之前。
编辑#3:当用断点测试我的代码时,我发现下面的for-loop永远不会被贯穿 - 甚至一次都没有。这使我相信:
A.正确的目录未与
B. iCloud的连接无法看到该目录中的文件
C.我NSMetadataQuery没有被正确安装 D.完全不同的东西
这里是一个开始永远也不会被运行for循环的代码:
NSArray *queryResults = [query results];
for (NSMetadataItem *result in queryResults) {
我还没有得到任何结果。我甚至尝试将流程从背景队列中移出,但是所做的只是将结果设为'(null'而不是'()'。是否有可能我的'URLForUbiquityContainerIdentifier'设置不正确? –
You不需要上面的NSURL,因此你不需要ContainerIdentifier。看看[示例代码](https://github.com/erica/iOS-5-Cookbook/tree/master/C18/02- UIDocument)从Erica Sadun精美的iOS食谱中找到,你需要检查CloudHelper类 – SAE
究竟是什么FileList?从命名约定看起来像一个类,不像对象或变量。 – SAE