2010-06-04 20 views
0

J'ai créé un NSMetadataQuery pour rechercher tous les fichiers audio disponibles par Spotlight, sur le modèle de la commande suivante, qui renvoie beaucoup de résultats:Puis-je bloquer sur un Spotlight NSMetadataQuery?

mdfind kMDItemContentTypeTree == "public.audio" 

Voici le code que je utilise:

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]; 
} 

Pour une raison quelconque, la requête semble rester indéfiniment dans la phase de collecte et n'obtient jamais un seul résultat. Je voudrais savoir pourquoi c'est le cas, et s'il y aurait une façon plus élégante de bloquer le thread en attendant un résultat, de préférence en évitant l'interrogation.

Mon application n'est pas basée sur Cocoa mais sur NSFoundation, et n'a pas de boucle d'évènement. Je me rends compte que l'approche conventionnelle pour traiter les requêtes Spotlight est de s'abonner à une notification d'événement, mais je ne sais pas comment bloquer en attendant une, et cette approche semble un peu trop lourde pour mes objectifs.

Pour formuler ma question aussi simplement que possible, puis-je bloquer mon fil en attendant que le NSMetadataQuery termine la phase de collecte initiale? Si c'est le cas, comment?

Répondre

2

Au lieu de [NSThread sleepForTimeInterval:0.1] essayer:

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

Le premier est en fait arrêter le fil tout à fait, ce qui signifie que la requête ne peut pas être en cours d'exécution. Ce dernier est un peu comme dormir, sauf qu'il permet également aux sources d'événements de tirer.