В чем разница синхронного и асинхронного вызова
Что проверяют
Понимаете ли вы разницу между «вызывающий ждёт результат» и «вызывающий идёт дальше» и как это ложится на главный поток iOS. Следом обычно показывают код с DispatchQueue.main.sync и спрашивают, что произойдёт, или просят сравнить GCD с async/await.
Как отвечать
Синхронный вызов блокирует текущий поток до завершения работы. Асинхронный возвращает управление сразу, а результат приходит позже: через замыкание, делегат или await.
Важно не смешивать два измерения:
- sync/async: ждёт ли вызывающий поток.
queue.sync { }ждёт,queue.async { }нет; - serial/concurrent: сколько задач очередь выполняет одновременно.
DispatchQueue.mainпоследовательная, глобальные очереди конкурентные.
Главное правило iOS: интерфейс обновляется только с главного потока, и его нельзя занимать долгой работой. Синхронный сетевой запрос или чтение большого файла на главном потоке замораживает интерфейс, а при долгой блокировке система убивает приложение по watchdog.
Классическая ловушка: DispatchQueue.main.sync из главного потока даёт дедлок, потому что поток ждёт задачу, которая стоит в очереди за ним самим. То же самое с sync на последовательную очередь изнутри неё.
В Swift Concurrency await это точка приостановки, а не блокировка: поток освобождается и выполняет другую работу, пока ждём результат URLSession.shared.data(from:). Код, который трогает интерфейс, помечается @MainActor, а в языковом режиме Swift 6 компилятор ловит гонки данных на этапе сборки.
Синхронность уместна, когда операция короткая и нужен строгий порядок, например чтение общего состояния через последовательную очередь с sync.
Где спотыкаются
Считают асинхронный вызов параллельным. Блок, отправленный через async на главную очередь, выполнится на том же главном потоке, просто позже.
Обновляют UI прямо в completion handler URLSession, который вызывается на фоновой очереди.
Превращают асинхронный вызов в синхронный через DispatchSemaphore и делают это на главном потоке. Интерфейс висит так же, как при синхронном запросе, а внутри Swift Concurrency семафоры ещё и ломают модель кооперативного пула потоков.