2013-01-01 45 views
1

我一直在努力将添加到我的项目中(这在包子中很痛苦),我可以保存和移除文件,但是我无法获得存储在iCloud中的文件。我试过了大约10个不同网站的解决方案(包括Apple文档)。每当我打电话给[self.query startQuery];,一切似乎都在起作用:调用正确的方法,这些方法的执行完全按照它们的方式执行。然后,当我要求我的应用的iCloud Documents目录中的文件有时,我得到两个圆括号(当我在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:当用断点测试我的代码时,我发现下面的永远不会被贯穿 - 甚至一次都没有。这使我相信:
A.正确的目录未与
B. iCloud的连接无法看到该目录中的文件
C.我NSMetadataQuery没有被正确安装 D.完全不同的东西

这里是一个开始永远也不会被运行for循环的代码:

NSArray *queryResults = [query results]; 
for (NSMetadataItem *result in queryResults) { 

回答

0

我已经解决了我的问题。获取iCloud中的文件列表只是正确定义,分配和初始化属性的问题。 SAE的回答和这个SO posting帮我解决了我的问题,并创建了这个名为iCloud Document Sync的GitHub回购。 iCloud Document Sync类将整个iCloud文档存储过程简化为几行代码。提交链接here修复了我的问题。

1

既然你已经设置的搜索范围是正确的,就没有必要在谓语使用特殊的过滤器。 只需使用:

query.predicate = [NSPredicate predicateWithFormat:@"NSMetadataItemFSNameKey == '*'"]; 

而获得阵列中使用:

NSMutableArray *array = [NSMutableArray array]; 
for (NSMetadataItem *item in query.results) { 
     [array addObject:[item valueForAttribute:NSMetadataItemFSNameKey]]; 
} 
+0

我还没有得到任何结果。我甚至尝试将流程从背景队列中移出,但是所做的只是将结果设为'(null'而不是'()'。是否有可能我的'URLForUbiquityContainerIdentifier'设置不正确? –

+0

You不需要上面的NSURL,因此你不需要ContainerIdentifier。看看[示例代码](https://github.com/erica/iOS-5-Cookbook/tree/master/C18/02- UIDocument)从Erica Sadun精美的iOS食谱中找到,你需要检查CloudHelper类 – SAE

+0

究竟是什么FileList?从命名约定看起来像一个类,不像对象或变量。 – SAE