Я играл с UIDocument недавно и путаю с понятием о dispatch_sync/dispath_asyncпроцесс тупиковый с вложенным dispatch_sync/dispath_async
У меня есть метод, который выборка всех документов информации
for (int i=0; i < noteDocuments.count; i++) {
NSURL * fileURL = [noteDocuments objectAtIndex:i];
NoteDocument *doc = [[NoteDocument alloc] initWithFileURL:fileURL];
[doc openWithCompletionHandler:^(BOOL success) {
[doc closeWithCompletionHandler:^(BOOL success) {
[self addOrUpdateInfoWithDoc:doc];
}];
}];
}
Всё отлично работает с этот простой подход.
Тогда я пытаюсь dispatch_sync/dispath_async
Первый с dispath_sync
dispatch_sync(dispatch_queue_create("test", DISPATCH_QUEUE_PRIORITY_DEFAULT), ^{
for (int i=0; i < noteDocuments.count; i++) {
NSURL * fileURL = [noteDocuments objectAtIndex:i];
NoteDocument *doc = [[NoteDocument alloc] initWithFileURL:fileURL];
[doc openWithCompletionHandler:^(BOOL success) {
[doc closeWithCompletionHandler:^(BOOL success) {
[self addOrUpdateInfoWithDoc:doc];
}];
}];
}
});
После добавления dispatch_sync как этот метод никогда не закончить. Это меня смущает, потому что dispath_sync должен вернуться в основную очередь после того, как был выполнен блок, который в этом случае должен немедленно вернуться к openWithCompletionHandler
.
Затем с любопытством меняю его dispatch_async (только для эксперимента)
dispatch_async(dispatch_queue_create("test", DISPATCH_QUEUE_PRIORITY_DEFAULT), ^{
for (int i=0; i < noteDocuments.count; i++) {
NSURL * fileURL = [noteDocuments objectAtIndex:i];
NoteDocument *doc = [[NoteDocument alloc] initWithFileURL:fileURL];
[doc openWithCompletionHandler:^(BOOL success) {
[doc closeWithCompletionHandler:^(BOOL success) {
[self addOrUpdateInfoWithDoc:doc];
}];
}];
}
});
Результат также путаешь меня, я EXC_BAD_INSTRUCTION на линии [doc openWithCompletionHandler:^(BOOL success) {
Может кто-нибудь объяснить, что происходит под капотом? Это то, что я понимаю, но это явно неправильно.
Даже '- (void) openWithCompletionHandler: (void (^) (успех BOOL)) completeHandler' вызвал свой блок в главной очереди' dispatch_sync' уже был завершен, так как openWithCompletionHandler асинхронен правильно? – sarunw
Э-э, я неправильно понял проблему. Обновлен ответ. –