Почему 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 планирует свою работу асинхронно. Вы должны были видеть в журнале, что ваш блок не выполняется в главном потоке. (Примечание: вам нужно убедиться, что основной поток не завершится до того, как блок был выполнен, чтобы увидеть журнал.)

Другие вопросы по тегам