我创建了一个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
结束初始收集阶段时阻止我的帖子吗?如果是这样,怎么样?
答案 0 :(得分:2)
而不是[NSThread sleepForTimeInterval:0.1]
尝试:
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
前者实际上完全停止了线程,这意味着查询无法运行。后者有点像睡觉,除了它还允许事件源发射。