Анализ проблем в реализации AppCoordinator

Экран показан модально через present, поэтому popToRoot не закрывает его. Подписка также живёт до освобождения coordinator, а не обязательно до закрытия профиля.

Короткий ответ

Что ответить на собеседовании

Экран показан модально через present, поэтому popToRoot не закрывает его. Подписка также живёт до освобождения coordinator, а не обязательно до закрытия профиля.

Подробный разбор

Ответ с пояснениями

Условие

В данном примере показан класс‑координатор, отвечающий за отображение экрана профиля и обработку события выхода пользователя. Обратите внимание на использование RxSwift, DisposeBag и захват navigationController в замыкании.

final class AppCoordinator {
    let navigationController: UINavigationController
    let disposeBag = DisposeBag()

    func presentProfile() {
        let controller = ProfileController()

        controller.rx.didTapLogout
            .bind(onNext: { [weak navigationController] in
                navigationController?.popToRootViewController(animated: true)
            })
            .disposed(by: disposeBag)

        navigationController.present(controller, animated: true)
    }
}

Ответ

Экран показан модально через present, поэтому popToRoot не закрывает его. Подписка также живёт до освобождения coordinator, а не обязательно до закрытия профиля.

Для выхода сначала завершите сессию в соответствующем сервисе, затем согласованно закройте modal через dismiss и перестройте нужную навигацию. Хранение всех подписок в одном долгоживущем DisposeBag может накапливать их при повторном открытии; срок подписки нужно связать с конкретным экраном или его coordinator. Слабый захват navigationController сам по себе не ошибка и не гарантирует отсутствие других циклов. В приведённом классе также отсутствует инициализатор для обязательного свойства navigationController.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее