GCD или Swift Concurrency: что выбрать
Вопрос
Чем Swift Concurrency лучше GCD и остались ли задачи для GCD?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Линейный код вместо колбэков, ошибки через `throws`
Структурированная конкурентность: дети, отмена, ожидание
Проверка гонок данных компилятором: акторы, Sendable, режим Swift 6
Кооперативный пул без взрыва потоков, в отличие от многих очередей GCD
GCD остаётся для старого кода, точного контроля очередей и низкоуровневых API
Не смешивать: не блокировать потоки пула семафорами
Что могут спросить следом
- Как вызвать async-функцию из синхронного кода?
- Что такое thread explosion в GCD?
Разбор
GCD даёт очереди и блоки, но вся безопасность на разработчике: какая очередь, кто синхронизирует доступ, кто отменяет. Swift Concurrency переносит это в язык. Код с async/await линейный, ошибки через throws, отмена встроена. Структурированная конкурентность гарантирует, что дочерние задачи завершатся или отменятся вместе с родителем. Акторы и Sendable дают компилятору проверить гонки данных, а в режиме Swift 6 это ошибки компиляции. Ещё плюс: задачи выполняются на пуле размером с число ядер, и нет взрыва потоков, когда сотни блоков блокируются в разных очередях. GCD я оставляю для старого кода, для случаев, где нужна конкретная очередь (например, API, требующее DispatchQueue), и для низкоуровневых вещей вроде DispatchSource. Главное правило: не блокировать потоки пула семафорами и sync.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.