2010-06-04 2 views
0

나는 결과 많은 돌려 다음 명령을 모델로 스포트 라이트를 통해 사용할 수있는 모든 오디오, 검색 할 NSMetadataQuery을 만들었습니다Spotlight NSMetadataQuery를 차단할 수 있습니까?

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]; 
} 
: 여기

mdfind kMDItemContentTypeTree == "public.audio" 

을 내가 사용하는 코드입니다

어떤 이유로 쿼리가 수집 단계에 무기한으로 남아있는 것처럼 보이며 절대로 단일 결과를 얻지 못합니다. 이것이 왜 그런지, 그리고 결과를 기다리는 동안 스레드를 차단하는 좀 더 우아한 방법이 있을지, 좋으면 폴링을 피하는 지 알고 싶습니다.

내 응용 프로그램은 실제로 코코아 기반이 아니라 NSFoundation을 기반으로하므로 이벤트 루프가 없습니다. Spotlight 쿼리를 처리하는 기존의 접근 방식은 이벤트 알림을 구독하는 것이지만 하나를 기다리는 동안 차단하는 방법을 알지 못합니다. 그런 접근 방식은 다소 과장된 것 같습니다.

가능한 한 간단하게 내 질문에 NSMetadataQuery이 초기 수집 단계를 마칠 때까지 기다리는 동안 스레드를 차단할 수 있습니까? 그렇다면 어떻게? 대신 [NSThread sleepForTimeInterval:0.1] 시도의

답변

2

:

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

는 전자는 실제로 쿼리를 실행 할 수 없음을 의미합니다 모두 스레드를 중지한다. 후자는 이벤트 소스가 실행될 수 있다는 점을 제외하고는 잠자는 것과 같습니다.

관련 문제