В чем отличие асинхронного подхода от синхронного
Что проверяют
Различаете ли вы две оси: синхронность против асинхронности и последовательность против параллельности. Для iOS это напрямую про главный поток: почему интерфейс зависает и как этого избежать. Следом обычно спрашивают про DispatchQueue.main.sync и async/await.
Как отвечать
Синхронный вызов не возвращает управление, пока работа не закончится: вызывающий поток ждёт. Асинхронный возвращает управление сразу, а результат приходит позже, через замыкание, делегат или точку await. Это не синоним параллельности: асинхронные задачи могут по очереди выполняться на одном потоке.
Как это выглядит в iOS:
- главный поток: на нём работают UIKit и SwiftUI, касания и отрисовка. Синхронная сеть или тяжёлый парсинг на нём замораживают интерфейс, а долгая блокировка при запуске приводит к тому, что watchdog системы завершает приложение;
- GCD:
queue.async {}ставит задачу в очередь и сразу возвращается,queue.sync {}блокирует текущий поток до завершения.DispatchQueue.main.syncс главного потока даёт дедлок; - Swift Concurrency: функции с
async,Task, акторы.awaitэто точка приостановки: поток не блокируется, а освобождается под другую работу.@MainActorгарантирует выполнение на главном потоке, а в языковом режиме Swift 6 компилятор строго проверяет гонки данных; - колбэки и Combine: более старые способы,
URLSessionс completion handler, издатели Combine.
Синхронность уместна для быстрых операций без ожидания: чтение из кэша в памяти, короткий sync на последовательной очереди для защиты общего состояния.
Где спотыкаются
Отождествляют асинхронность с многопоточностью. После await код может продолжиться на другом потоке, но само слово async новый поток не создаёт.
Обновляют UI прямо из колбэка URLSession, который приходит на фоновой очереди. Итог: предупреждения Main Thread Checker и случайные падения.
Думают, что Task {} внутри @MainActor уходит в фон. Он наследует актор, и тяжёлая синхронная работа внутри всё равно заблокирует главный поток. Для этого есть Task.detached или вынос работы в неизолированную функцию.