Почему dispatch_sync в главном потоке вызывает взаимоблокировку, а NSBlockOperation - нет?
В качестве заголовка dispatch_sync() в главной очереди и главном потоке вызовет взаимоблокировку, например:
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"%@", [NSThread currentThread]);
});
Но NSBlockOperation не приведет к тупику:
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"%@", [NSThread currentThread]);
}];
[operation start];
Итак, я не понимаю, почему? Эта функция не возвращается, пока блок не завершится, как dispatch_sync, так почему же она не вызывает взаимоблокировку? И что между ними?
1 ответ
Как вы можете прочитать здесь в официальной документации дляNSBlockOperation
:
"Блоки, добавленные в операцию блока, отправляются с приоритетом по умолчанию в соответствующую рабочую очередь. Сами блоки не должны делать никаких предположений относительно конфигурации среды их выполнения".
В частности, это означает, что ваш блок не будет выполняться в основном потоке.
Для одновременных операций (что верно для NSBlockOperation
), метод start
планирует свою работу асинхронно. Вы должны были видеть в журнале, что ваш блок не выполняется в главном потоке. (Примечание: вам нужно убедиться, что основной поток не завершится до того, как блок был выполнен, чтобы увидеть журнал.)