我创建了一个NSMetadataQuery来搜索通过Spotlight可用的所有音频,其模仿以下命令,该命令返回了大量结果:

mdfind kMDItemContentTypeTree == "public.audio"


这是我正在使用的代码:

NSMetadataQuery * q = [[[NSMetadataQuery alloc] init] autorelease];
[q setPredicate:[NSPredicate predicateWithFormat:@"kMDItemContentTypeTree == 'public.audio'", nil]];
NSLog(@"%@", [[q predicate] predicateFormat]);
if ([q startQuery])
    while ([q isGathering]) {
        NSLog(@"Polling results: %i", [q resultCount]);
        [NSThread sleepForTimeInterval: 0.1];
    }
    [q stopQuery];
}


由于某种原因,查询似乎无限期地处于收集阶段,并且永远不会得到一个结果。我想知道为什么会这样,以及在等待结果(最好避免轮询)时是否有更优雅的方法来阻塞线程。

我的应用程序实际上不是基于Cocoa而是基于NSFoundation,因此到目前为止还没有事件循环。我意识到处理Spotlight查询的常规方法是订阅事件通知,但是我不知道如何在等待事件通知时进行阻塞,而这种方法对于我来说似乎有点过大了。

为了尽可能简单地表达我的问题,我可以在等待NSMetadataQuery结束初始收集阶段时阻塞线程吗?如果是这样,怎么办?

最佳答案

代替[NSThread sleepForTimeInterval:0.1]尝试:

[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];


前者实际上是完全停止线程,这意味着查询无法运行。后者有点像睡觉,除了它还允许触发事件源。

关于objective-c - 我可以阻止Spotlight NSMetadataQuery吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2977928/

10-09 01:49