Выбор ответа Middle Навигация, координаторы и deep links обновлено

Утечка дочерних координаторов

Вопрос

Дочерний координатор оформления заказа добавлен в childCoordinators родителя. Пользователь закрыл поток свайпом назад. Что часто идёт не так?

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

Выберите вариант, и откроется разбор.

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

Коротко

Правильный ответ: Родитель не узнаёт о закрытии и не удаляет дочерний координатор: он и его объекты висят в памяти. Координатор хранит родитель, а контроллеры хранит навигационный стек.

Варианты ответа

  1. Свайп назад запрещён при использовании координаторов, и пользователь не может закрыть поток жестом
  2. Дочерний координатор освобождается автоматически вместе с контроллером, поэтому проблем нет
  3. Родитель не узнаёт о закрытии и не удаляет дочерний координатор: он и его объекты висят в памятиправильный ответ
  4. Навигационный контроллер падает с исключением, потому что координатор продолжает ссылаться на снятый экран

Разбор

Координатор хранит родитель, а контроллеры хранит навигационный стек. Если пользователь ушёл системным жестом или кнопкой «назад», код координатора не вызывается. Нужно отслеживать это: UINavigationControllerDelegate.didShow с проверкой, что контроллер потока больше не в стеке, или presentationControllerDidDismiss для модальных экранов, и тогда удалять дочерний координатор.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме