Возможные дефекты в реализации координатора приложения №2

popToRoot не закрывает модально представленный профиль. Кроме того, subscriptions в долгоживущем bag могут накапливаться при повторных открытиях.

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

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

popToRoot не закрывает модально представленный профиль. Кроме того, subscriptions в долгоживущем bag могут накапливаться при повторных открытиях.

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

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

Условие

Рассмотрите пример координатора, который отвечает за показ экрана профиля и использует RxSwift для обработки события выхода пользователя. Обратите внимание на потенциальные проблемы, связанные с управлением навигацией и возможными утечками памяти.

final class AppCoordinator {
    let navController: UINavigationController
    let bag = DisposeBag()

    func presentProfile() {
        let profileVC = ProfileController()

        profileVC.rx.didTapLogout
            .bind(onNext: { [weak navController] in
                navController?.popToRootViewController(animated: true)
            })
            .disposed(by: bag)

        navController.present(profileVC, animated: true)
    }
}

Ответ

popToRoot не закрывает модально представленный профиль. Кроме того, subscriptions в долгоживущем bag могут накапливаться при повторных открытиях.

Для modal нужен dismiss и согласованный переход к неавторизованному flow после реального logout. Подписку желательно привязать к сроку жизни данного профиля/дочернего coordinator, а не хранить бесконечно в общем bag. Слабый захват navController предотвращает его удержание этим closure, но не доказывает отсутствие всех утечек: реализация didTapLogout не показана. Класс также требует init, устанавливающий обязательный navController. Проверять нужно как корректность навигации, так и освобождение экранов после закрытия.

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

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

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

Подробнее