Я заполняю NSOutlineView, рекурсивно читая каталог. После того, как каталог и его подкаталоги прочитаны, я обновляю схему, вызывая reloadData внутри отправки, как показано ниже.
-(void)readDir:(NSString*)path {
dispatch_async(dispatch_get_main_queue(), ^{ \
[outlineView reloadData];
});
//////////
//// some internal stuff
//////////
NSArray* subs = [self getSubDirs:path];
for (NSString* p in subs) {
[self readDir:p];
}
}
Вышеупомянутый метод вызывается из диспетчера, чтобы пользовательский интерфейс был реактивным.
- (void)startAll {
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_async(queue, ^{
[self readDir:@"/"];
});
}
Проблема в том, что иногда вызывается dispatch_async(dispatch_get_main_queue(), ...) во время чтения подкаталогов (это вообще асинхронно!) и приложение вылетает
Если я использую dispatch_sync(dispatch_get_main_queue(), ...) (обратите внимание на версию sync), контур всегда рисуется правильно, но очень-очень медленно, поэтому возникает вопрос:
как я могу изменить код так, чтобы он был как можно быстрее, и дождаться завершения dispatch_[a]sync(dispatch_get_main_queue(),...)?