NSMetadataQuery enableUpdates

时间:2013-05-02 00:04:47

标签: ios icloud nsmetadataquery

我无法理解更新如何与NSMetadataQuery协同工作。

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

我是否必须启动新查询以获取更新?如果是这样,enableUpdates和disableUpdates的功能是什么?

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

2 个答案:

答案 0 :(得分:2)

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

一个是http://blog.wadetregaskis.com/icloud-documentation-is-crap/的博客。本段解释NSMetadatQuery如何真正起作用:

  

[这]解释了关于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方法中已经下载了多少给定文件并让它运行进度条。如果有人想知道更多或看到更多的代码最终工作,我很乐意帮忙。

答案 1 :(得分: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:读取文档)时才会进行下载。

相关问题