Почему Spotlight иногда не запускает мой запрос? - PullRequest
1 голос
/ 23 июня 2009

Я играю с Spotlight API, как в версии для углерода, так и для какао, и мне кажется, что время от времени возникает одна и та же проблема: запрос никогда не запускается и никогда не запускается любые уведомления. Тем не менее, я хочу подчеркнуть, что большую часть времени он работает , поэтому происходит что-то странное.

Я не пишу никаких приложений. Это всего лишь тестовая система Spotlight, поэтому запрос не запускается на основе пользовательского ввода. Вместо этого он настроен и выполняется в applicationDidFinishLaunching: внутри моего контроллера. Первоначально я пытался сделать это в awakeFromNib, но в этом случае запрос никогда не выполнялся. (Моя теория состоит в том, что RunLoop еще не запущен, но я не уверен.)

Вот код из applicationDidFinishLaunching: для углерода:

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);

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

Что дает? Возможно, applicationDidFinishLaunching: не является подходящим местом для запроса Spotlight.

1 Ответ

1 голос
/ 16 декабря 2011

Я запускаю запрос Spotlight в applicationDidFinishLaunching, и у меня нет проблем, поэтому я не думаю, что это ваша проблема.

У меня есть пара вещей, чтобы попробовать. Вместо передачи nil в name в addObserver: selector: name: object попробуйте передать NSMetadataQueryDidFinishGatheringNotification для имени и выполнить второй вызов, передав NSMetadataQueryDidUpdateNotification для имени. Первый генерирует результат, когда запрос завершается в первый раз. Второй будет предоставлять обновления. (Но только когда что-то меняется.)

...