Что такое async/await в Swift Concurrency
Что проверяют
Понимаете ли вы, что это структурированная конкурентность, а не просто замена колбэков, и знаете ли про акторы.
Как отвечать
async помечает функцию, которая может приостановиться, await это точка приостановки. Поток при этом не блокируется: он освобождается и берёт другую работу, а продолжение выполнится, когда результат будет готов.
func loadProfile() async throws -> Profile {
let user = try await api.user() // поток свободен на время ожидания
let jobs = try await api.jobs(for: user) // последовательно
return Profile(user: user, jobs: jobs)
}Что даёт по сравнению с колбэками: линейный код вместо вложенности, обработка ошибок обычным try, невозможность забыть вызвать обработчик, и главное, структурированность.
Структурированная конкурентность означает, что задачи образуют дерево: async let и TaskGroup запускают параллельные ветви, а родитель не завершится, пока не завершатся дети. Отмена распространяется вниз автоматически, и её проверяют через Task.checkCancellation().
async let user = api.user()
async let settings = api.settings()
let profile = try await Profile(user: user, settings: settings) // параллельноОтдельно про изоляцию данных: акторы гарантируют, что их состояние изменяется только одним контекстом за раз, а @MainActor привязывает код к главному потоку. Компилятор в строгом режиме проверяет пересечение границ, и это то, чего не давал GCD.
Где спотыкаются
Пишут последовательные await там, где нужен async let или группа, и теряют параллельность.
Считают, что async создаёт поток.
Обновляют интерфейс не из @MainActor.
Игнорируют отмену: длинный цикл без проверки не остановится.