Какой у вас опыт с async/await
Что проверяют
Работали ли вы со структурированной конкурентностью или просто заменили замыкания на await. Интервьюер ждёт разговора про отмену, изоляцию и гонки, а не про читаемость кода. Следом спрашивают, как вы переводили колбэки и что изменилось со строгой проверкой конкурентности в Swift 6.
Как отвечать
Стройте ответ вокруг задач, которые решали.
- база:
async-функция приостанавливается наawait, поток при этом не блокируется и возвращается в кооперативный пул.Taskсоздаёт точку входа из синхронного кода,async letиwithThrowingTaskGroupдают параллельность с ожиданием дочерних задач; - отмена кооперативна: задачу никто не убивает принудительно, вы сами проверяете
Task.isCancelledили зовётеtry Task.checkCancellation(), а для мостов естьwithTaskCancellationHandler. В SwiftUI модификатор.taskотменяет работу при исчезновении вью, и это главный аргумент противTask.detached; - изоляция:
@MainActorна всём, что трогает UI, акторы для разделяемого состояния,Sendableдля типов, пересекающих границу. В языковом режиме Swift 6 гонки ловит компилятор, и это основной источник ошибок сборки при миграции; - мосты к старому коду:
withCheckedContinuationиwithCheckedThrowingContinuationс жёстким правилом ровно одного вызоваresume. Два вызова это краш, ноль вызовов это навсегда подвисшая задача; - потоки данных:
AsyncStreamиAsyncSequenceвместо делегатов и Combine.
Обязательно приведите свой пример: что переписали, что сломалось, как чинили. Хорошо заходит рассказ про реентерабельность актора: во время await состояние могло измениться, поэтому предположения, сделанные до приостановки, нужно перепроверять.
Где спотыкаются
Считают, что await сам уводит работу на фоновый поток. У изолированного кода исполнение после приостановки возвращается в ту же изоляцию, а тяжёлые вычисления нужно уносить явно.
Раздают Task.detached вместо структурированных задач. Такая задача теряет приоритет, контекст и отмену вместе с родителем.
Заворачивают старый API в континуацию и забывают про ветку ошибки, где resume не вызывается. Экран висит на бесконечном загрузчике, а причину ищут в сети.