Код последовательной очереди (кроме основного) выполняется в основном потоке? - PullRequest
0 голосов
/ 12 июня 2019

1) Последовательные очереди в ios, созданные

_queue = dispatch_queue_create("serial-queue-1", nil);

работает в основном потоке или в другом потоке.

И

2) Если он выполняется в главном потоке, то если мы синхронно отправим блок кода в указанную выше очередь по

dispatch_sync(_queue, ^{ method1(); method2(); });

Будет ли он выполнять полный блок кода, когда эта очередь получит свою очередь, или он также может покинуть эту очередь для выполнения какой-то другой между ними?

1 Ответ

0 голосов
/ 12 июня 2019

Как правило, блок, отправляемый в очередь, может выполняться в любом доступном потоке, включая основной поток. Исключением является то, что блок, отправленный в основную очередь, всегда будет выполняться в главном потоке.

Когда вы используете dispatch_sync в последовательной очереди, он блокирует текущую очередь , но не текущую нить .

Из dispatch_sync документации

Вызов этой функции и ориентация на текущую очередь приводят к тупику.

Если вы нацеливаетесь на текущую очередь, используя dispatch_sync, вы получите тупик, но если вы нацеливаетесь на другую очередь, вы не получите тупик, даже если отправленный блок окажется в том же потоке.

На самом деле:

В качестве оптимизации производительности эта функция по возможности выполняет блоки в текущем потоке

Итак, предполагая, что dispatch_sync в вашем вопросе был вызван из основной очереди, блок будет выполняться в главном потоке, так как вы заблокировали основную очередь, и поэтому основной поток доступен для выполнения работы.

Многозадачность iOS не является преимущественной, поэтому ваш блок не может «потерять» поток; блок будет выполнен полностью, прежде чем освободить поток. Это предполагает, что method1 и method2 не отправляют дополнительные блоки сами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...