【问题标题】:NSMetaDataQuery never calls back with NSMetadataQueryDidFinishGatheringNotificationNSMetaDataQuery 从不使用 NSMetadataQueryDidFinishGatheringNotification 回调
【发布时间】:2012-11-10 03:59:52
【问题描述】:

对于我正在编写的 iCloud 插件,我将我的 iCloud 管理器类订阅到这些 iCloud NSMetaDataQuery 观察者:

// Add a predicate for finding the documents
NSString* filePattern = [NSString stringWithFormat:@"*.%@", @"*"];

self.metadataQuery = [[NSMetadataQuery alloc] init];

// Before starting to query, it is required to set the search scope.
arrayWithObject:NSMetadataQueryUbiquitousDocumentsScope]];

// It is also required to set a search predicate.
[self.metadataQuery setPredicate:[NSPredicate predicateWithFormat:@"%K LIKE %@", NSMetadataItemFSNameKey, filePattern]];

// Listen for the second phase live-updating
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(queryDidReceiveNotification:) name:NSMetadataQueryDidUpdateNotification object:nil];

// Listen for the first phase gathering
[[NSNotificationCenter defaultCenter] addObserver:self
                                      selector:@selector(queryIsDoneGathering:) name:NSMetadataQueryDidFinishGatheringNotification
                                           object:nil];

[self.metadataQuery startQuery];

问题是这些选择器实际上都没有被回调,甚至一次都没有,而且我特别需要 NSMetaDataQueryDidUpdateNotification 来跟踪云中文件的上传/下载进度。

奇怪的是,前几天我有这个工作,但不知何故它停止了工作,我盲目地试图弄清楚问题到底是什么。通过订阅 NSMetadataQueryDidStartGatheringNotification,我可以看到它确实开始了,但就像它永远不会结束一样。这很奇怪。

我想知道是否有人对上述代码有什么问题有任何线索?或者我还能在哪里寻找问题。

感谢您的宝贵时间:)

【问题讨论】:

  • 你有没有发现这有什么问题?我想要一个答案。
  • 很遗憾,没有,我从来没有发现这是什么原因。我在网上的任何其他地方都找不到任何解释:(仍然希望得到答案。
  • 您是否要搜索所有文件的列表?您是否尝试过将 filepattern 设为单一文件类型,例如 .txt?
  • 我在this apple sample 之后设计了我的查询,我也遇到了同样的问题。在主线程上运行并不能修复它。

标签: objective-c ios icloud nsnotificationcenter nsmetadataquery


【解决方案1】:

确保在主线程中启动 NSMetadataQuery。当时没有记录此要求。

【讨论】:

  • 这现在记录在startQuery
  • 据记载,您必须在主队列或与 NSMetadataQuery 关联的队列上启动它。
  • 这太棒了,谢谢。一直在努力解决这个问题。
【解决方案2】:

这是挖掘的秘密。我不知道你现在是否已经放弃了,但我终于可以帮上忙了。

事实证明,对于某些(全部?)C++ 应用程序配置,存在不会自动运行的消息泵。在我的应用程序中,在我的[m_query startQuery] 调用之后放置这样的循环后,我终于开始获得预期的回调:
// make it look syncronous for now while( m_state != finished ) { Check_For_Interruption(); [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:timeslice]]; //<--**this line is the key** }
设置回调以正确更新m_state 变量。

我的示例只是阻塞,使用它自己的线程时间片来运行循环(除非被达到超时中断),但这也可以以异步方式设置。

对于那些过度支持旧版支持的人来说还有一点需要注意:
这种方法确实导致应用程序开始在 OS X 10.9 和更早版本上泄漏 mach 端口。不过,还没有看到任何更新的问题。

【讨论】:

  • 感谢您发布此答案...解决了我的问题!
猜你喜欢
  • 2017-02-14
  • 2018-02-12
  • 2016-12-06
  • 2014-04-22
  • 2013-12-16
  • 2011-12-14
  • 1970-01-01
  • 1970-01-01
  • 2021-10-07
相关资源
最近更新 更多