我已经设法解决了这个问题,但这是一个典型的案例,尝试了很多不同的事情,遇到了很多砖墙,我不再记得我到底做了什么来解决这个问题,更不用说为什么我一开始就遇到了这个问题地方。也许我可以分享一些我遇到的事情。
一个是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 方法中下载了多少给定文件,并让它运行进度条。如果有人想了解更多或查看更多最终有效的代码,我很乐意提供帮助。