Вопрос проверяет умение сравнивать подходы к асинхронности и аргументировать переход на современные API.
async/await избавляет от вложенных completion-блоков. Код становится линейным и читаемым. Проще обрабатывать ошибки и отмену. Меньше шансов допустить retain cycle. Это снижает сложность и количество багов.
Сравнение async/await и completion-based API — один из самых частых вопросов на iOS-собеседованиях.
Completion-блоки быстро приводят к:
глубокой вложенности
сложной логике обработки ошибок
трудночитаемому коду
Пример типичной проблемы — callback hell.
Линейный поток выполнения
Код читается как обычный синхронный:
сначала загрузка
потом обработка
затем обновление UI
Единый механизм ошибок
Ошибки обрабатываются через do / catch.
Нет необходимости пробрасывать Result через каждый уровень.
Меньше retain cycle
Нет необходимости захватывать self в completion-блоках.
Это снижает риск утечек памяти.
Поддержка отмены
Асинхронные задачи легко отменяются через Task.
В completion-based API это сложно и неунифицировано.
Лучшая композиция
Несколько асинхронных операций легко комбинируются:
последовательно
параллельно
поддержка старых iOS-версий
низкоуровневые или legacy API
библиотеки без async-интерфейса
async/await значительно упрощает асинхронный код, снижает когнитивную нагрузку и делает приложения более надежными по сравнению с completion-based API.