В чем разница между методами viewWillAppear и viewDidAppear и когда их использовать
Что проверяют
Понимаете ли вы, что происходит между этими вызовами, и не грузите ли данные не в том месте. От выбора зависит, увидит ли пользователь мигание интерфейса.
Как отвечать
viewWillAppear(_:) вызывается перед добавлением представления на экран, до начала анимации перехода. Пользователь ещё не видит результат, поэтому здесь обновляют то, что должно быть готово к первому кадру: перечитать изменившиеся данные, обновить подписи, скрыть или показать элементы, снять выделение строки таблицы, подписаться на уведомления.
viewDidAppear(_:) вызывается после того, как переход завершился и экран уже виден. Сюда переносят то, что не должно тормозить появление или требует видимого экрана: запуск аналитики просмотра, старт анимаций и таймеров, показ модальных окон и подсказок, запрос разрешений, начало воспроизведения.
Важные детали, которые и отличают хороший ответ:
- оба метода вызываются каждый раз при появлении экрана, а не однократно, поэтому одноразовую настройку делают в
viewDidLoad, иначе подписки и наблюдатели множатся; - парные методы
viewWillDisappearиviewDidDisappearиспользуют для отписки и остановки таймеров, иначе экран продолжает работать в фоне; - размеры представления в обоих методах ещё могут быть неактуальны, геометрию считают в
viewDidLayoutSubviews; - в
viewWillAppearне стоит запускать долгие запросы синхронно: переход будет ждать, и появление экрана подтормозит.
Где спотыкаются
Подписываются на уведомления в viewWillAppear без отписки в viewWillDisappear и получают многократные срабатывания обработчика.
Загружают данные в viewDidAppear, из-за чего пользователь сначала видит пустой экран, а потом содержимое.
Считают, что после viewDidLoad эти методы уже не вызовутся.