Эта проблема все еще сохраняется. Я смог проследить это до следующего расхождения:
- Если вы ограничите свой предикат поиска в запросе ключом имени,
например
[NSPredicate predicateWithFormat:@"%K like[cd] %@", NSMetadataItemFSNameKey, @"*"]
, тогда он будет работать как положено (публикуя все четыре уведомления о жизненном цикле запросов).
- Если, однако, вы пытаетесь либо составным предикатом, либо пытаетесь работать с путем,
как в
[NSPredicate predicateWithFormat:@"%K BEGINSWITH %@", NSMetadataItemPathKey, [self cloudDocumentsURL].path]
OR
[NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:namePred, pathPred, nil]];
Тогда будет опубликовано только первоначальное уведомление.
Я пробовал буквально сотни комбинаций этих настраиваемых переменных в нескольких тестовых и предназначенных для производства приложениях за последний год, и еще не нашел контрпример к этой гипотезе.
К сожалению, NSMetadataQuery просто не работает для вездесущих магазинов (по состоянию на 10.8).
Мой обходной путь - получить необработанные результаты запроса и работать в основном с привязанным NSArrayController, который может фильтровать его результаты. Это будет означать рефакторинг далеко от query.results для большей части существующего кода, и есть снижение производительности (предположительно), но это единственный способ, который я нашел. Я хотел бы альтернативу.