Что обеспечивает ключевое слово await в Swift?
Что проверяют
Понимаете ли вы, что await это точка приостановки, а не блокировка потока, и что сам по себе он не добавляет параллельности. Отсюда видно, писали ли вы на структурированной конкурентности или только читали про неё.
Как отвечать
Ключевое слово помечает место, где функция может приостановиться и отдать поток другой работе. Пока идёт ожидание, поток свободен, в отличие от семафора или синхронного вызова на очереди, которые поток удерживают. Вызвать await можно только из асинхронного контекста: из функции с async или изнутри Task.
Что стоит добавить самому:
- после возобновления код может продолжиться на другом потоке. Возврат на главный обеспечивает пометка
@MainActor, а не самawait; - атомарности между строками нет: пока функция ждала, состояние могли изменить, в том числе из-за реентерантности актора;
- два ожидания подряд выполняются последовательно. Параллельный запуск даёт
async letили группа задач; try awaitсовмещает ожидание и ошибку, ловится обычнымdo/catch;- отмена кооперативная: задача сама не прервётся, нужно проверять
Task.isCancelledили зватьTask.checkCancellation().
async let user = loadUser() // оба запроса стартуют сразу
async let feed = loadFeed()
let screen = try await Screen(user: user, feed: feed)Старый код с замыканиями заворачивают в withCheckedThrowingContinuation, следя, чтобы продолжение вызывалось ровно один раз.
Где спотыкаются
Считают, что await ускоряет работу. Два независимых запроса, написанные подряд, дают сумму времён, а не максимум. Ускорение появляется только с async let или группой задач, и это первое, что спрашивают следом.
Думают, что после возобновления снова оказались на главном потоке, и трогают интерфейс. Работа с UI выполняется на главном акторе, поэтому нужный тип или метод помечают @MainActor, а не полагаются на поток, который достался задаче.
Проверяют условие, ждут, а дальше действуют по устаревшей проверке. За время ожидания экран могли закрыть, а данные обновить. После каждой точки приостановки состояние перечитывают заново и проверяют, не отменена ли задача.