为什么要快速连续多次调用NSMetadataQueryDidUpdateNotification?

时间:2012-07-05 10:00:48

标签: ios icloud nsmetadataquery

为了监控iCloud容器中的文件更改,我已注册

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(processiCloudUpdates:)
                                             name:NSMetadataQueryDidUpdateNotification
                                           object:nil];

理想情况下,每当收到更新消息时,我都要打开每个UIDoc并检查设置是否已更改。如果仅NSMetadataQueryDidUpdateNotification被调用一次,那就没问题了。但是,它被多次触发(我没有忘记removeObserver等并且运行了几个实例),因此每次触发更新通知时加载所有文件都是非常不切实际的(如果我有5个文件,这被称为4次,我会快速连续打开20个UIDocs。例如,如果我更新一个文件(并且在我无处不在的容器中只有一个文件),就会发生这种情况:

2012-07-05 10:51:39.565 Meernotes[7842:707] ... NSMetadataQuery update
2012-07-05 10:51:42.468 Meernotes[7842:707] ... NSMetadataQuery update
2012-07-05 10:51:45.216 Meernotes[7842:707] ... NSMetadataQuery update
2012-07-05 10:51:47.036 Meernotes[7842:707] ... NSMetadataQuery update

还有其他方法可以确定文件何时发生变化? NSFileVersion也没有多大帮助。

1 个答案:

答案 0 :(得分:3)

每当NSMetadataQueryDidUpdateNotification结果中NSMetadataItem的某些属性更新时,

NSMetadataQuery就会发出问题。它包括部分上传或下载进度。因此,在此通知处理期间尝试打开UIDocument实例是错误的。

相反,您可以通过观察NSMetadataItem的属性值来确定文档下载的时刻,然后将其排队以便打开。

不要忘记处理NSMetadataQueryDidFinishGatheringNotification。当接收者完成初始结果 - 查询的收集阶段

时,它会被发布