Причина такого поведения заключается в том, что может быть много глобальных очередей с одинаковым QoS, но всегда будет только одна главная очередь.
Ваш первый пример предсказуем - он всегда будет вести себя одинаково,потому что вы всегда отправляете задачи в одну и ту же очередь - главную.Задачи, переданные с помощью async
, будут выполняться асинхронно (что означает, что функция async
будет немедленно возвращена), но новая задача не начнет выполнение, пока не завершится текущая задача.Вот упрощенная модель того, что происходит:
Task 1:
Submit task 2
Print "D"
Task 2:
Print "A"
Submit task 3
Print "C"
Task 3:
Print "B"
Task 1
состоит из отправки Task 2
и материалов для печати.Task 1
выполняется в главной очереди, и Task 2
добавляется в ту же очередь.Это означает, что Task 2
не может запуститься, пока текущее задание - Task 1
- не завершит выполнение.
Пример Seconf немного отличается.Каждый раз, когда вы звоните DispatchQueue.global
, вы гарантированно получаете очередь с определенным QoS, но это не обязательно будет та же самая очередь.Может показаться, что в очереди, которую вы отправили print("A")
, не было никаких других ожидающих выполнения задач, и она смогла выполнить свою работу немедленно, до возврата метода async
.
Использование ранее предоставленной модели - если Task 2
добавлено в очередь, отличную от запущенной Task 1
, тогда не нужно ждать, пока Task 1
завершит выполнение.Но опять же, в этом случае все зависит от того, какую очередь вы получаете при каждом вызове DispatchQueue.global
, и это не гарантируется