UIDocument openWithCompletionHandler:强制 NSMetadataQuery 更新
Posted
技术标签:
【中文标题】UIDocument openWithCompletionHandler:强制 NSMetadataQuery 更新【英文标题】:UIDocument openWithCompletionHandler: forces NSMetadataQuery to update 【发布时间】:2014-04-22 02:13:35 【问题描述】:我正在尝试使用 iCloud,并且某个应用正在收听订阅 NSMetadataQueryDidFinishGatheringNotification
的 NSMetadataQuery
更新。
当应用程序收到通知时,我使用 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 更新的主要内容,如果未能解决你的问题,请参考以下文章