UIDocument openWithCompletionHandler:强制 NSMetadataQuery 更新

Posted

技术标签:

【中文标题】UIDocument openWithCompletionHandler:强制 NSMetadataQuery 更新【英文标题】:UIDocument openWithCompletionHandler: forces NSMetadataQuery to update 【发布时间】:2014-04-22 02:13:35 【问题描述】:

我正在尝试使用 iCloud,并且某个应用正在收听订阅 NSMetadataQueryDidFinishGatheringNotificationNSMetadataQuery 更新。

当应用程序收到通知时,我使用 openWithCompletionHandler: 读取了一些 iCloud UIDocument 文件,但该调用导致 NSMetadataQuery 再次通知我更新,因此应用程序进入无限循环 update > read > update > read > …

openWithCompletionHandler: 应该这样做吗?我该怎么做才能防止它出现这样的循环?

【问题讨论】:

【参考方案1】:

我也遇到过这个问题,好像是你问题的答案

openWithCompletionHandler: 应该这样做吗?

是“是”。我可以假设,但这听起来很合理,当您执行openWithCompletionHandler: 时,会调用该块,同时加载所有数据。但是使用NSMetadataQueryDidUpdateNotification,您可以跟踪下载进度(例如,调用 openWithHandler 块之前的数据加载百分比)。

到目前为止我的解决方案是:

关注NSMetadataUbiquitousItemDownloadingStatusCurrent的通知更新 当我想打开文档时禁用更新 为文档打开块内的查询启用更新

由于我的查询正在查看单个文件,因此我不怕丢失通知,在打开一个文档期间可能会跳过通知。看了几个文档可能就不是这样了,但是不知道怎么解决比较好

【讨论】:

【参考方案2】:

openWithCompletionHandler:应该这样吗?

这是不正确的。 NSMetadataQuery 通知更新。它的原因是:

(NSMetadataQueryDidUpdateNotification) ,表示iCloud更新数据(上传文件 从沙盒到 iCloud 或从 iCloud 下载文件到沙盒)

当你调用[_query startQuery]时,它只调用NSMetadataQueryDidFinishGatheringNotification来通知iCloud中的数据。之后,当数据更新时NSMetadataQueryDidUpdateNotification

我认为这个圈子是正确的,因为当您从 iCloud 获得新数据时,您应该更新屏幕中的数据。

希望这些信息对您有所帮助。

【讨论】:

但是当我只是访问(打开)新数据时,我得到一个 NSMetadataQueryDidUpdateNotification 调用。只是因为我调用 openWithCompletionHandler: 让我们测试一下:你等到所有数据都得到。之后,您通过 openWithCompletionHandler 打开 1 个 UIDocument。我确定 NSMetadataQueryDidUpdateNotification 不会调用。

以上是关于UIDocument openWithCompletionHandler:强制 NSMetadataQuery 更新的主要内容,如果未能解决你的问题,请参考以下文章

为啥加载 UIDocument 需要 40 秒?

autosaveWithCompletionHandler:(UIDocument)覆盖问题

如何在主队列上加载 UIDocument?

UIDocument 无法再次关闭?

UIDocument 的非 iCloud 使用

在哪里存储 UIDocument 的预览?