Экран показан модально через present, поэтому popToRoot не закрывает его. Подписка также живёт до освобождения coordinator, а не обязательно до закрытия профиля.
Анализ проблем в реализации AppCoordinator
Экран показан модально через 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.