0

Как видно из названия, dispatch_sync() на главной очереди и основной поток вызывает тупиковая, так:Почему dispatch_sync в основном потоке вызывает тупик, но NSBlockOperation нет?

dispatch_sync(dispatch_get_main_queue(), ^{ 
    NSLog(@"%@", [NSThread currentThread]); 
}); 

Но NSBlockOperation не приведет к тупиковой:

NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{ 
    NSLog(@"%@", [NSThread currentThread]); 
}]; 
[operation start]; 

Итак, я не понимаю почему? Эта функция не возвращается до тех пор, пока блок не завершится так же, как dispatch_sync, так почему он не вызывает тупик? И в чем разница между ними?

ответ

1

Как вы можете прочитать here in the official Documentation for NSBlockOperation:

«Блоки добавлены к операции блока отправляются с приоритетом по умолчанию для соответствующей очереди работ блоки сами по себе не должны делать никаких предположений о конфигурации их среды выполнения.».

Это означает, что ваш блок не будет выполнен на основном потоке.

Для параллельных операций (что справедливо для NSBlockOperation), метод start расписания его работы асинхронно. Вы должны были видеть в журнале, что ваш блок не выполняется в основном потоке. (Примечание: вам необходимо убедиться, что основной поток не будет завершен до того, как блок будет выполнен, чтобы просмотреть журнал.)