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