Наблюдение за уведомлениями от ViewController
Когда данные обновляются в базе данных, я отправляю уведомление NotificationCenter
от клиента с новыми данными. ViewController
будет наблюдать это уведомление, поэтому пользовательский интерфейс может быть обновлен соответствующим образом.
Сбоит ли приложение, если контроллер представления соберет новое уведомление и попытается обновить пользовательский интерфейс, пока его нет на экране View Controller?
или будет ли функция, которая наблюдает за уведомлением, подождать, пока контроллер представления не будет запущен?
3 ответа
Если ваши уведомления имеют смысл только тогда, когда ваш контроллер представления на экране, то вы должны слушать в viewWillAppear
и перестать слушать в viewWillDisappear
,
Альтернативой является прослушивание уведомлений в viewDidLoad и прекращение прослушивания в dealloc
(Цель-C) или deinit
(Swift). Если вы это сделаете, ваш контроллер представления будет получать указанные уведомления все время, пока он жив, независимо от того, виден он на экране или нет.
Если вы продолжите прослушивать уведомления, когда ваш контроллер представления не является передним, вы не будете аварийно завершать работу, но вы, вероятно, будете делать обновления, которые не видны, что может сделать ваше приложение менее отзывчивым.
Кроме того, вы можете использовать уведомления, чтобы обновить модель контроллера представления (хранилище данных) и сделать код достаточно умным, чтобы отслеживать, когда контроллер представления виден, и обновлять пользовательский интерфейс только тогда, когда он виден.
РЕДАКТИРОВАТЬ:
Обратите внимание, что если вы регистрируетесь для уведомления в viewDidLoad, а ваше приложение работает на iOS >= 9, вам не нужно отменять регистрацию для уведомления в deinit
/ dealloc
, ОС теперь обрабатывает отмену регистрации объекта для уведомлений, когда он освобождается.
Обычно вы добавляете наблюдателей в viewDidLoad/viewWillAppear и удаляете их в viewDidDisappear / deinit, чтобы избежать ошибок, таких как прослушивание уведомлений клавиатуры
Также попробуйте обновить содержимое любого viewController в viewDidAppear
Примечание: приложение завершится сбоем, если контроллер представления наблюдает и освобождает перед удалением наблюдений в методах viewDidDisappear или deinit.
---- никакого ожидания не произойдет, будь то наблюдатель или нет
Новый "быстрый" способ установки наблюдателей - использовать блоки завершения вместо селекторов addObserver(forName:object:queue:using:) ', так что вы можете сохранить маркер наблюдения в необязательном var, array или dictinary, когда вам нужно было наблюдать уведомление и аннулировать (удалить из коллекции) последний, чтобы прекратить наблюдение. В этом случае "obsrever" автоматически прекратит наблюдение во время освобождения, и безопаснее не подписываться несколько раз на одно и то же уведомление.