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

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

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

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

【问题讨论】:

    标签: ios objective-c macos cocoa core-data


    【解决方案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 不会调用。
      猜你喜欢
      • 2012-08-09
      • 2012-05-29
      • 1970-01-01
      • 1970-01-01
      • 2015-11-17
      • 1970-01-01
      • 2014-03-08
      • 2019-03-20
      • 1970-01-01
      相关资源
      最近更新 更多