0

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すると、最初の収集フェーズが終了するのを待っている間、スレッドをブロックできますか? もしそうなら、どのように?

4

1 に答える 1

2

[NSThread sleepForTimeInterval:0.1]試す代わりに:

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

前者は実際にはスレッドを完全に停止しているため、クエリを実行できません。後者は、イベント ソースの起動も許可する点を除けば、スリープに似ています。

于 2010-06-04T21:35:27.243 に答える