我无法理解更新如何与NSMetadataQuery协同工作。
我正在尝试确定文件是否已从iCloud下载完毕。我的初始查询清楚地告诉我文件没有下载,我可以开始下载,但是如果需要任何时间来下载文件,我想建立一个进度条。我已经调用了enableUpdates,但它似乎没有改变下载/下载状态或下载百分比,即使我相当确定文件正在下载。 (我在一段时间内陷入困境。如果我退出并重新运行应用程序,它会将文件视为已下载并跳过while循环。)
我是否必须启动新查询以获取更新?如果是这样,enableUpdates和disableUpdates的功能是什么?
是否有一些不同的方式必须调用初始查询才能获得更新?我从文档中的某些内容中得到了这种印象,但我找不到任何似乎可以解释如何解释的细节。
答案 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的解释:
基本上你只是让查询一直在运行(除非你进入后台)。只要情况发生变化,您就会收到通知,并相应地维护文档列表。尚未从云下载的文档最初是占位符;正如您可以从下一节“从iCloud下载文档文件”中看到的那样,只有在您使用startDownloadingUbiquitousItemAtURL:error:
(或尝试使用openWithCompletionHander:
读取文档)时才会进行下载。