Что будет выведено на экран при последовательном выполнении задач на главном потоке
Что проверяют
Понимаете ли вы, что главная очередь последовательная, и различаете ли синхронный код, async на той же очереди и попытку sync на самого себя. Вопрос с подвохом: обычно дают кусок кода, где порядок вывода не совпадает с порядком строк.
Как отвечать
Разберите типичный пример.
print("1")
DispatchQueue.main.async { print("2") }
print("3")Вывод будет 1, 3, 2. Главная очередь последовательная: блок из async встаёт в конец и выполнится, когда текущая работа на потоке закончится и цикл выполнения дойдёт до очереди. Пока исполняется ваш метод, ничего из очереди взяться не может.
Если вместо async написать DispatchQueue.main.sync из главного потока, получится взаимоблокировка: поток ждёт выполнения блока, а блок ждёт освобождения потока.
Всё, что написано подряд без переключения очереди, выполняется строго по порядку, включая sleep и тяжёлые вычисления. Отсюда второй вывод, который хотят услышать: длинная синхронная задача на главном потоке не замедляет интерфейс, а полностью его останавливает, потому что отрисовка и обработка касаний идут через ту же очередь. Промежуточные print при этом уйдут в консоль сразу, а изменения UILabel пользователь увидит одним кадром в конце.
В современном коде тот же ответ формулируется через @MainActor: помеченный им код исполняется на главном акторе последовательно, а await это точка, где выполнение может прерваться и пустить вперёд другую задачу.
Где спотыкаются
Путают порядок при вложенных async. Блок, поставленный в очередь изнутри другого блока, выполнится не сразу после него, а после всего, что уже стоит в очереди.
Второе: считают DispatchQueue.main.async из главного потока способом выполнить код немедленно. Это отложенное выполнение, и на нём держится частый приём: отложить работу до конца текущего цикла вёрстки.
Третье: называют sleep на главном потоке просто плохой практикой. Скажите точнее: система считает неотвечающее приложение зависшим и может снять его по сторожевому таймеру, а пользователь до этого видит замороженный экран.