【问题标题】:Can I block on a Spotlight NSMetadataQuery?我可以阻止 Spotlight NSMetadataQuery 吗?
【发布时间】:2012-10-02 13:54:18
【问题描述】:

我创建了一个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 结束初始收集阶段时阻止我的线程吗?如果有,怎么做?

【问题讨论】:

    标签: objective-c cocoa spotlight


    【解决方案1】:

    代替[NSThread sleepForTimeInterval:0.1]试试:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-07
      • 2015-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多