Я регулярно использую плагины (загруженные NSBundles) для инкапсуляции некоторых функций. Теперь я хочу использовать NSMetadataQuery в одном из своих подключаемых модулей, но столкнулся с проблемами потоковой передачи, которые не могу решить.
Внутри основного класса плагина я настроил запрос следующим образом:
NSMetadataQuery *mdQuery = [[NSMetadataQuery alloc] init];
[mdQuery setPredicate:[NSPredicate predicateWithFormat:@"(kMDItemFSName LIKE 'Project *')"]];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(processQuery:)
name:nil
object:mdQuery];
[mdQuery startQuery];
И уведомления перехватываются:
- (void)processQuery:(NSNotification *)notification
{
NSMetadataQuery *mdQuery = [notification object];
if ([[notification name] isEqualToString:NSMetadataQueryDidStartGatheringNotification]) {
NSLog(@"%@ %@ Query started", [self class], NSStringFromSelector(_cmd));
} else if ([[notification name] isEqualToString:NSMetadataQueryGatheringProgressNotification]) {
NSLog(@"%@ %@ %ld", [self class], NSStringFromSelector(_cmd), (long)[mdQuery resultCount]);
} else if ([[notification name] isEqualToString: NSMetadataQueryDidFinishGatheringNotification]) {
NSUInteger theResultCount = [mdQuery resultCount];
theResultCount = 10; //for now
for (NSUInteger i; i < theResultCount; i++) {
NSLog(@"%@ %@ %ld %@", [self class], NSStringFromSelector(_cmd), (long)i, [mdQuery resultAtIndex:i]);
}
} else {
NSLog(@"%@ %@ NSMetadataQueryDidUpdateNotification: %@", [self class], NSStringFromSelector(_cmd), notification);
}
}
Этот код отлично работает в приложении, но при запуске с подключаемым модулем всегда принимается только NSMetadataQueryDidStartGatheringNotification и ничего больше.
Я нашел один или два поста людей, борющихся с одной и той же проблемой, и один из них (Джеймс Буканек в уведомлении О, где ты?) решил свою проблему, вызвав CFRunLoopRun(); сразу после startQuery и CFRunLoopStop(CFRunLoopGetCurrent()); когда запрос был выполнен. Одна проблема заключается в том, что запущенный таким образом цикл выполнения является синхронным, в то время как NSMetadataQuery явно является асинхронным, а другая заключается в том, что в подключаемом модуле он никогда не проходил дальше NSMetadataQueryGatheringProgressNotification. Затем я попытался дать NSMetadataQuery свой собственный поток, но снова было получено только NSMetadataQueryDidStartGatheringNotification. Я не знаю, может ли проблема быть решена, но мне бы очень хотелось, чтобы некоторые советы.