отметили
0
человек
голосовать
0
человек
Как сломать Swift Concurrencyhabr.com

Статья на Хабре разбирает типичную проблему, с которой сталкиваются разработчики при переходе на 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, когда интерфейс виснет на ровном месте.
Ага, особенно весело когда этот deadlock прилетает в production, а дебажишь его полдня.
Чтобы комментировать, нужно войти.