Какие существуют вопросы по синхронному и асинхронному выполнению задач
Что проверяют
Различаете ли вы пары «синхронно или асинхронно» и «последовательная или параллельная очередь» и знаете ли, чем ошибка в этом месте заканчивается на реальном устройстве. Почти всегда следом дают кусок кода с DispatchQueue.main.sync и просят найти проблему.
Как отвечать
Разложите тему на вопросы, которые реально задают:
syncпротивasync:syncблокирует вызывающий поток до завершения задачи,asyncставит задачу в очередь и сразу возвращает управление. О том, на каком потоке задача выполнится, это ничего не говорит;- serial против concurrent: последовательная очередь выполняет задачи по одной, параллельная может запускать несколько.
DispatchQueue.mainпоследовательная и привязана к главному потоку; - дедлок:
DispatchQueue.main.syncс главного потока илиsyncна ту же serial-очередь изнутри неё. Поток ждёт сам себя; - QoS:
.userInitiatedдля того, что пользователь ждёт на экране,.utilityдля долгой фоновой работы,.backgroundдля обслуживания, которое система может откладывать надолго; - Swift Concurrency:
async/await,Task,TaskGroupиasync letдля параллельного запуска,actorдля защиты состояния,@MainActorдля UI. В режиме Swift 6 компилятор ловит гонки данных через проверкуSendable; - координация в GCD:
DispatchGroup, чтобы дождаться нескольких задач,OperationQueueдля зависимостей и отмены.
Отдельно проговорите, что обновлять UI можно только с главного потока, и в новом коде это гарантирует @MainActor, а не ручной DispatchQueue.main.async в каждом колбэке.
Где спотыкаются
Отвечают «async значит в фоне». Задача, отправленная через async на главную очередь, выполнится на главном потоке.
Ставят тяжёлую работу на .background, а потом удивляются, что загрузка на экране длится секунды: у этого класса самый низкий приоритет.
Думают, что await создаёт новый поток. Это точка приостановки: поток освобождается для других задач, а продолжение может выполниться уже на другом потоке.