MiddleКодЧастоЕщё не отвечали
Предскажите вывод в консоль этих вложенных диспатчей на очереди
Этот код выполняется на главном потоке. work — последовательная dispatch-очередь. Определите точный порядок, в котором пять букв напечатаются в консоль.
Ограничения:
- Рассуждайте о том, какие вызовы блокируют, а какие откладываются в run loop.
- Считайте, что на главном потоке больше ничего не поставлено в очередь.
let work = DispatchQueue(label: "work")
print("A")
work.sync {
print("B")
DispatchQueue.main.async { print("C") }
print("D")
}
print("E")
Определите порядок вывода и обоснуйте его.
Порядок — A B D E C. work.sync блокирует главный поток и выполняет блок на месте, поэтому B и D идут до E. C поставлен через main.async, поэтому выполняется лишь после возврата главного потока в run loop — после E.
- ✗Думают, что
main.asyncвыполняет блок на месте, а не на следующем проходе run loop - ✗Считают, что
work.syncвозвращается до завершения своего блока - ✗Полагают, что запланированный блок выполняется там, где записан в коде
- →Почему
Cне может выполниться, пока главный поток внутриwork.sync? - →Изменится ли порядок, если заменить
work.syncнаwork.async?
Порядок вывода — A B D E C.
// A — печатается сразу, синхронно
// work.sync — блокирует главный поток и выполняет блок:
// B — печатается
// main.async — ставит C в очередь главного потока (НЕ выполняет сейчас)
// D — печатается
// sync возвращается, главный поток продолжает:
// E — печатается
// главный поток возвращается в run loop:
// C — печатается последним
work.sync блокирует главный поток до конца блока, поэтому B и D идут до E. main.async лишь ставит C в очередь главного потока; этот блок не может выполниться, пока главный поток занят внутри sync и пока не вернётся в run loop — то есть после E.