Какой у вас опыт с Swift Concurrency?
Что проверяют
Понимаете ли вы модель изоляции, а не только синтаксис async/await. Интервьюер хочет услышать, где выполняется код, как отменяются задачи и как вы разбирались с ошибками о гонках данных. Следом часто спрашивают про реентерабельность акторов или про миграцию на Swift 6.
Как отвечать
Начните с того, что именно переводили на Swift Concurrency: сетевой слой, загрузку картинок, работу с базой. Затем каркас:
- структурная конкурентность:
async letдля фиксированного числа параллельных задач,withTaskGroupиwithThrowingTaskGroupдля динамического. Дочерние задачи не переживают родителя, отмена родителя доходит до детей; - неструктурные задачи:
Task {}наследует актор и приоритет места создания,Task.detachedне наследует ничего, и нужен он редко; - отмена: кооперативная. Задача сама проверяет
Task.isCancelledили вызываетtry Task.checkCancellation(), а модификатор.taskв SwiftUI отменяет работу, когда view исчезает; - акторы:
actorзащищает своё состояние,@MainActorотвечает за UI. На каждомawaitвнутри актора могут вклиниться другие вызовы, поэтому инварианты после ожидания проверяются заново; - Sendable и Swift 6: в языковом режиме Swift 6 проверка гонок строгая, это ошибки, а не предупреждения. В Swift 6.2 появились изоляция модуля по умолчанию на
MainActorи атрибут@concurrent, что упрощает приложения, где почти всё живёт на главном потоке; - мосты: старые API с колбэками оборачиваются в
withCheckedThrowingContinuation, потоки событий вAsyncStream.
Если реального опыта мало, скажите, что знаете модель по документации, и объясните, как перевели бы на неё конкретный кусок с GCD.
Где спотыкаются
Считают, что async значит «выполнится в фоне». Где работает nonisolated async-функция, зависит от версии и настроек языка, а Task {} из view вообще остаётся на главном акторе.
Глушат ошибки компилятора через @unchecked Sendable и nonisolated(unsafe), не понимая, что гонка никуда не делась.
Блокируют поток внутри асинхронного кода семафором или DispatchGroup.wait(). Кооперативный пул потоков маленький, так легко получить зависание.