Могу ли я заблокировать Spotlight NSMetadataQuery? - PullRequest
0 голосов
/ 05 июня 2010

Я создал 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];
}

По какой-то причине запрос, кажется, остается в фазе сбора неопределенно долго и никогда не получает ни одного результата.Я хотел бы знать, почему это так, и существует ли более элегантный способ блокировать поток во время ожидания результата, предпочтительно избегая опроса.

Мое приложение на самом деле не основано на Какао, а наNSFoundation и до сих пор не имеет цикла обработки событий.Я понимаю, что традиционный подход к работе с запросами Spotlight заключается в подписке на уведомление о событии, но я не знаю, как блокировать его при ожидании, и этот подход кажется мне немного излишним.

Чтобы сформулировать мой вопрос как можно проще, могу ли я заблокировать поток, ожидая, пока NSMetadataQuery завершит начальную фазу сбора?Если да, то как?

1 Ответ

2 голосов
/ 05 июня 2010

Вместо [NSThread sleepForTimeInterval:0.1] try:

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

Первый фактически полностью останавливает поток, что означает, что запрос не может быть запущен.Последнее похоже на сон, за исключением того, что оно также позволяет срабатывать источникам событий.

...