2

我无法理解更新如何与 NSMetadataQuery 一起使用。

我正在尝试确定文件是否已完成从 iCloud 下载。我的初始查询清楚地告诉我文件没有下载,我可以开始下载,但如果下载文件需要任何时间,我想设置一个进度条。我调用了 enableUpdates,但它似乎并没有改变下载/下载状态或下载百分比,即使我相当确定文件正在下载。(我陷入了一个while循环。如果我退出并重新运行应用程序,它会看到文件已下载并跳过while循环。)

我是否必须开始新查询才能获取更新?如果是,那么 enableUpdates 和 disableUpdates 的作用是什么?

是否有一些不同的方式必须调用初始查询才能获取更新?我从文档中的某些内容中得到了这种印象,但我找不到任何似乎可以解释如何解释的细节。

4

2 回答 2

2

我已经设法解决了这个问题,但这是一个典型的案例,尝试了很多不同的事情,遇到了很多砖墙,我不再记得我到底做了什么来解决这个问题,更不用说为什么我一开始就遇到了这个问题地方。也许我可以分享一些我遇到的事情。

一个是http://blog.wadetregaskis.com/icloud-documentation-is-crap/上的博客。本段解释了NSMetadatQuery真正的工作原理:

[This] 解释了关于 NSMetadataQuery 的一些关键问题:长话短说,NSMetadataQueryDidUpdateNotification并没有达到您的预期。当然不是我所期望的。我阅读文档时说它将用于交付结果,并将NSMetadataQueryDidFinishGatheringNotification在完整的第一次通过完成后发布。这是 Apple API 中其他地方使用的一种非常典型的模式(包括 Spotlight,因此人们会认为它NSMetadataQuery的工作方式相同)。但事实并非如此。

相反,所有第一次完整运行的结果都由NSMetadataQueryDidFinishGatheringNotification. NSMetadataQueryDidUpdateNotification纯粹用于后续的实时更改。

我认为可能给我带来问题的另一件事是,我可能同时有多个 NSMetadataQuery 实例处于活动状态。我不确定,也不知道为什么这会阻止他们中的任何一个发送更新通知。

无论如何,以下代码现在对我有用:

if (usingIcloud) {
    if (query) [query disableUpdates];

    query.predicate = [NSPredicate predicateWithFormat:@"%K like '*.caf' or %K like '*.mov'", NSMetadataItemFSNameKey, NSMetadataItemFSNameKey];
    query.searchScopes = [NSArray arrayWithObject:NSMetadataQueryUbiquitousDocumentsScope];
    
    [[NSNotificationCenter defaultCenter]
         addObserver:self
         selector:@selector(updateUbiquitousDocuments:)
         name:NSMetadataQueryDidFinishGatheringNotification
         object:nil];
    
    [[NSNotificationCenter defaultCenter]
         addObserver:self
         selector:@selector(updateUbiquitousProgress:)
         name:NSMetadataQueryDidUpdateNotification
         object:nil];
    
    [query enableUpdates];
}

我能够获得更新,这些更新告诉我在我的 updateUbiquitousProgress 方法中下载了多少给定文件,并让它运行进度条。如果有人想了解更多或查看更多最终有效的代码,我很乐意提供帮助。

于 2013-05-04T03:01:11.347 回答
0

来自 Apple 的非常好的示例代码和解释:

https://developer.apple.com/library/ios/#documentation/DataManagement/Conceptual/DocumentBasedAppPGiOS/ManageDocumentLifeCycle/ManageDocumentLifeCycle.html#//apple_ref/doc/uid/TP40011149-CH4-SW6

基本上,您只需让查询一直运行(除非您进入后台)。每当情况发生变化时,您都会收到通知,并相应地维护您的文档列表。尚未从云端下载的文档最初是占位符;正如您从下一节“从 iCloud 下载文档文件”中看到的那样,下载不会发生,直到您要求使用startDownloadingUbiquitousItemAtURL:error:(或尝试使用 阅读文档openWithCompletionHander:)。

于 2013-05-02T03:04:39.030 回答