7

对于我正在编写的 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我可以看到它确实开始了,但就像它永远不会结束一样。这很奇怪。

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

感谢您的时间 :)

4

2 回答 2

17

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

于 2013-01-29T11:36:22.133 回答
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-12-07T23:14:54.567 回答