Будет напечатано только 7: printNumbers объявлена, но не вызывается. Запланированных ею блоков в реальном выполнении этого фрагмента нет.
Какой порядок вывода? №37
Будет напечатано только 7: printNumbers объявлена, но не вызывается. Запланированных ею блоков в реальном выполнении этого фрагмента нет.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Определите, в каком порядке будут напечатаны числа при выполнении следующего Swift‑кода:
func printNumbers() {
print(1)
DispatchQueue.main.async {
print(2)
DispatchQueue.main.async {
print(3)
DispatchQueue.global().sync {
print(4)
}
}
print(5)
}
print(6)
}
print(7)
Ответ
Будет напечатано только 7: printNumbers объявлена, но не вызывается. Запланированных ею блоков в реальном выполнении этого фрагмента нет.
Очереди внутри тела функции начинают играть роль только после вызова. Если добавить printNumbers() на главном потоке, синхронная часть напечатает 1, 6, затем главная очередь выполнит 2, 5, потом 3, 4, при условии работающего event loop. В отличие от main.sync из main queue, синхронный вызов global queue здесь сам по себе не создаёт такого же deadlock. Но это описание изменённого, а не исходного кода.