Completion handler или async/await
Вопрос
Сравните API на completion handler и на async/await. Как вы мигрируете старый код?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Completion: вложенность, легко забыть вызвать или вызвать дважды
Ошибки через `Result` вручную, отмена не встроена
async/await: линейный код, `throws`, структурированная отмена
Мост: `withCheckedThrowingContinuation`, продолжение вызвать ровно один раз
Миграция снизу вверх: сначала сетевой слой, обёртки для старых вызовов
Что могут спросить следом
- Что будет, если continuation не вызвать?
- Как Xcode помогает сгенерировать async-версию функции?
Разбор
Completion handler это escaping-замыкание, которое функция вызывает по завершении. Минусы: пирамида вложенности, ошибки в Result вручную, нет гарантии, что обработчик вызовут ровно один раз на каждой ветке, отмену придумываешь сам. Async/await даёт линейный код, ошибки через throws и try, отмену через структурированную конкурентность, а компилятор проверяет, что функция вернула значение на всех путях. Мигрирую снизу: сетевой клиент получает async-методы, а для старых callback-API пишу обёртку через withCheckedThrowingContinuation. Важно вызвать resume ровно один раз: двойной вызов это крэш, а пропущенный навсегда подвесит задачу, checked-версия хотя бы напишет об этом в лог. Сверху старые вызывающие могут пользоваться async через Task { }, пока их не переведут.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.