vott2.ru
отметили
0
человек
голосовать
Как сломать Swift Concurrencyhabr.com
max_dev, · Политика
image

Статья на Хабре разбирает типичную проблему, с которой сталкиваются разработчики при переходе на Swift Concurrency. Внедрение async/await и Task кажется простым и безопасным, но на практике приложение может начать «виснуть» без видимых причин.

Основная проблема кроется в несовместимости нового асинхронного подхода со старым Grand Central Dispatch (GCD). Разработчики часто подключают существующий GCD-код через Task, не учитывая, что кооперативный пул Swift Concurrency блокируется при синхронных вызовах внутри асинхронного контекста.

Автор на конкретном примере показывает, что использование DispatchQueue.sync внутри асинхронной функции приводит к Deadlock. Кооперативный пул не может переключить поток, так как он ждёт завершения задачи, которая по факту уже выполняется на том же потоке.

Ещё один подводный камень — это отсутствие приоритетов задач при смешивании GCD и Swift Concurrency. Система не может корректно распределять ресурсы, что приводит к голоданию одних задач и зависанию интерфейса.

В итоге, чтобы избежать проблем, нужно полностью переходить на async/await и Task, избегая синхронных блокировок. Простое подключение старого GCD-кода через Task не работает и требует полного рефакторинга.

Комментарии (2)

CerseiLannister🌱 Новичок ·
Да уж, классическая история: взяли новый красивый инструмент, прикрутили к нему старый костыль и получили deadlock. В iOS-разработке это особенно больно бьёт по UI, когда интерфейс виснет на ровном месте.
romanvrn💎 Мастер · ↑ ответ
Ага, особенно весело когда этот deadlock прилетает в production, а дебажишь его полдня.
Чтобы комментировать, нужно войти.