2009-06-23 9 views
1

Je suis en train de jouer avec l'API Spotlight, à la fois les versions Carbon et Cocoa, et je semble avoir le même problème surgir de temps en temps: La requête ne fonctionne jamais, et ne tire jamais de notifications. Cependant, je tiens à souligner que la plupart du temps fonctionne, donc quelque chose d'étrange se passe.Pourquoi Spotlight n'exécute-t-il pas parfois ma requête?

Je n'écris pas d'application particulière. Ceci est juste un faisceau de test Spotlight, donc la requête n'est pas déclenchée en fonction de l'entrée de l'utilisateur. Au lieu de cela, il est configuré et exécuté en applicationDidFinishLaunching: à l'intérieur de mon contrôleur. À l'origine, j'ai essayé de le faire dans awakeFromNib, mais dans ce cas, la requête jamais a couru. (Ma théorie est que le runloop n'a pas encore commencé, mais je ne suis pas sûr.)

Voici le code de applicationDidFinishLaunching: du carbone:

CFStringRef predicate = CFSTR("kMDItemContentTypeTree == 'public.movie'"); 
_query = MDQueryCreate(NULL, predicate, NULL, NULL); 
_query = (MDQueryRef)CFMakeCollectable(_query); 
[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(notify:) 
              name:nil 
              object:(id)_query]; 
MDQueryExecute(_query, kMDQueryWantsUpdates); 

j'ai écrit ci-dessus de la mémoire, de sorte qu'il peut contenir fautes de frappe qui n'étaient pas dans l'original. Le code d'origine compile et fonctionne très bien, sauf parfois ne fonctionne pas du tout.

Ce qui donne? Peut-être applicationDidFinishLaunching: n'est pas le bon endroit pour une requête Spotlight.

Répondre

1

Je lance une requête Spotlight dans applicationDidFinishLaunching et je n'ai aucun problème, donc je ne pense pas que ce soit votre problème.

J'ai quelques choses à essayer. Plutôt que de passer nil à name dans addObserver: selector: name: object essayez de passer NSMetadataQueryDidFinishGatheringNotification pour le nom et passez un deuxième appel en passant NSMetadataQueryDidUpdateNotification pour le nom. La première générera un résultat lorsque la requête sera exécutée pour la première fois. La seconde fournira des mises à jour. (Mais seulement quand quelque chose change.)

Questions connexes