【问题标题】:NSMetadataQuery enableUpdatesNSMetadataQuery enableUpdates
【发布时间】:2013-04-26 01:17:39
【问题描述】:

我无法理解更新如何与 NSMetadataQuery 一起使用。

我正在尝试确定文件是否已完成从 iCloud 下载。我的初始查询清楚地告诉我文件没有下载,我可以开始下载,但如果下载文件需要任何时间,我想设置一个进度条。我调用了 enableUpdates,但它似乎并没有改变下载/下载状态或下载百分比,即使我相当确定文件正在下载。 (我陷入了 while 循环。如果我退出并重新运行应用程序,它会看到文件已下载并跳过 while 循环。)

我是否必须启动新查询才能获取更新?如果是,那么 enableUpdates 和 disableUpdates 的作用是什么?

是否有一些不同的方式必须调用初始查询才能获取更新?我从文档中的某些内容中得到了这种印象,但我找不到任何似乎可以解释如何解释的细节。

【问题讨论】:

标签: ios icloud nsmetadataquery


【解决方案1】:

我已经设法解决了这个问题,但这是一个典型的案例,尝试了很多不同的事情并遇到了很多砖墙,以至于我不再记得我到底做了什么来解决这个问题,更不用说我为什么会遇到这个问题了首先。也许我可以分享一些我遇到的事情。

一个是http://blog.wadetregaskis.com/icloud-documentation-is-crap/ 的博客。本段解释了NSMetadatQuery 的实际工作原理:

[This] 解释了关于 NSMetadataQuery 的一些关键问题:长话短说,NSMetadataQueryDidUpdateNotification 并没有达到您的预期。当然不是我所期望的。我读到文档说它将用于交付结果,并且NSMetadataQueryDidFinishGatheringNotification 将在完整的第一遍完成后发布。这是 Apple API 中其他地方使用的一种非常典型的模式(包括 Spotlight,所以人们会假设 NSMetadataQuery 会起作用)。但事实并非如此。

相反,所有第一次完整运行的结果都由NSMetadataQueryDidFinishGatheringNotification 缓冲并提供。 NSMetadataQueryDidUpdateNotification 纯粹用于后续的实时更改。

我认为可能导致我出现问题的另一件事是,我可能同时有多个 NSMetadataQuery 实例处于活动状态。我不确定,也不知道为什么这会阻止他们中的任何一个发送更新通知。

无论如何,以下代码现在对我有用:

if (usingIcloud) {
    if (query) [query disableUpdates];

    query.predicate = [NSPredicate predicateWithFormat:@"%K like '*.caf' or %K like '*.mov'", NSMetadataItemFSNameKey, NSMetadataItemFSNameKey];
    query.searchScopes = [NSArray arrayWithObject:NSMetadataQueryUbiquitousDocumentsScope];
    
    [[NSNotificationCenter defaultCenter]
         addObserver:self
         selector:@selector(updateUbiquitousDocuments:)
         name:NSMetadataQueryDidFinishGatheringNotification
         object:nil];
    
    [[NSNotificationCenter defaultCenter]
         addObserver:self
         selector:@selector(updateUbiquitousProgress:)
         name:NSMetadataQueryDidUpdateNotification
         object:nil];
    
    [query enableUpdates];
}

我能够获得更新,这些更新告诉我在我的 updateUbiquitousProgress 方法中下载了多少给定文件,并让它运行一个进度条。如果有人想了解更多或查看更多最终运行的代码,我很乐意提供帮助。

【讨论】:

  • 我知道这已经过时了,但我正在为同样的事情苦苦挣扎,并且很想看到更多你的工作代码
  • 我已经有将近 3 年没有看过这个代码了,但是如果除了在这个网站上发布文本之外还有其他方法可以做的话,我会把整个项目发给你。您可以通过richard@rgpost.com 与我联系。
【解决方案2】:

来自 Apple 的非常好的示例代码和解释:

https://developer.apple.com/library/ios/#documentation/DataManagement/Conceptual/DocumentBasedAppPGiOS/ManageDocumentLifeCycle/ManageDocumentLifeCycle.html#//apple_ref/doc/uid/TP40011149-CH4-SW6

基本上,您只需让查询一直运行(除非您进入后台)。每当情况发生变化时,您都会收到通知,并相应地维护您的文档列表。尚未从云端下载的文档最初是占位符;正如您从下一节“从 iCloud 下载文档文件”中看到的那样,下载不会发生,直到您使用 startDownloadingUbiquitousItemAtURL:error: 要求它(或尝试使用 openWithCompletionHander: 阅读文档)。

【讨论】:

  • 我没有使用 UIDocument,只是将视频文件写入 iCloud,然后尝试在第二台设备上播放它们。据我所知,我的查询仍在运行,初步结果告诉我有问题的文件尚未下载。因此,我使用 startDownloadingUbiquitousItemAtURL:error 开始下载文件,但我从未收到已完成下载的更新或表示已下载任何百分比的更新。从你所说的听起来好像我应该能够定期检查元数据项的密钥以查看已下载了多少。
  • “所以我使用startDownloadingUbiquitousItemAtURL:error:”好吧,天哪,你可能在你的问题中提到了这一点。如果您的问题显示了一些关于您实际在做什么以及确切问题是什么的实际细节,那将会很有帮助。
  • “将视频文件写入 iCloud,然后尝试在第二台设备上播放”这真的是您想要做的事情吗?用户是否会对 iCloud 配额或后台带宽被视频文件吃掉感到高兴?我想知道这是否是对 iCloud 的一个很好的利用。只是一个想法......
  • 对不起,如果我的问题不够具体。我的问题是,即使我正在运行查询并调用了 enableUpdates,我似乎也没有从查询中获取更新。 NSMetadataUbiquitousItemPercentDownloadedKey 的值似乎保持为 0。
  • 您不是第一个注意到这一点的人。看看这个:stackoverflow.com/questions/8801372/… 和这个:stackoverflow.com/questions/11035276/…
猜你喜欢
  • 2017-08-25
  • 2016-05-04
  • 2014-04-22
  • 2011-04-19
  • 1970-01-01
  • 2011-04-23
  • 2015-11-17
  • 2013-09-02
  • 1970-01-01
相关资源
最近更新 更多