为啥 NSMetadataQueryDidUpdateNotification 被快速连续调用多次?

Posted

技术标签:

【中文标题】为啥 NSMetadataQueryDidUpdateNotification 被快速连续调用多次?【英文标题】:Why is NSMetadataQueryDidUpdateNotification being called several times in quick succession?为什么 NSMetadataQueryDidUpdateNotification 被快速连续调用多次? 【发布时间】:2012-07-05 10:00:48 【问题描述】:

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

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

理想情况下,每当我收到已进行更新的消息时,我都想打开我的每个 UIDocs 并检查设置是否已更改。这很好,如果 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】:

NSMetadataQueryDidUpdateNotification 每次当NSMetadataQuery 结果中的任何NSMetadataItem 的某些属性更新时都会发出问题。它包括部分上传或下载进度。因此在此通知处理期间尝试打开UIDocument 实例是错误的。

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

也不要忘记处理NSMetadataQueryDidFinishGatheringNotification。它在接收者完成查询的初始结果收集阶段时发布

【讨论】:

我认为“如何监控 iCloud 中的变化?”这个问题仍然存在。

以上是关于为啥 NSMetadataQueryDidUpdateNotification 被快速连续调用多次?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?

为啥需要softmax函数?为啥不简单归一化?

为啥 g++ 需要 libstdc++.a?为啥不是默认值?

为啥或为啥不在 C++ 中使用 memset? [关闭]

为啥临时变量需要更改数组元素以及为啥需要在最后取消设置?

为啥 CAP 定理中的 RDBMS 分区不能容忍,为啥它可用?