objective-c - 我可以阻止 Spotlight NSMetadataQuery 吗?

标签 objective-c cocoa spotlight

我创建了一个 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]];

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

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

相关文章:

ios - 尝试通过 FusionCharts XT 在 iOS 上绘制图表

cocoa - NSMetadataQuery 找不到 Lion、Mountain Lion 或 Mavericks 中的文件

objective-c - 如何获取有关媒体文件的特定信息(持续时间、比特率、FPS 等)

ios - 未调用 didReceiveRemoteNotification,iOS 10

iphone - @autoreleasepool 做什么?

ios - 在 Swift 中从 Objective-C 访问 extern NSString

html - 带有 CSS 的聚光灯元素

cocoa - 检查音频文件替代聚光灯

ios - UIImagePickerControllerOriginalImage 在 iPhone 4 中收到内存警告

objective-c - 如何正确处理 NSTextField 中的 <Return> + 修饰键?