Ответ вслух Middle Замыкания и захват обновлено

Completion handler или async/await

Вопрос

Сравните API на completion handler и на async/await. Как вы мигрируете старый код?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Completion handler это escaping-замыкание, которое функция вызывает по завершении. Минусы: пирамида вложенности, ошибки в Result вручную, нет гарантии, что обработчик вызовут ровно один раз на каждой ветке, отмену придумываешь сам.

Что должно прозвучать в ответе

  • 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 ошибок.