2016-12-13 6 views
1

Я хочу обновлять отображение моего приложения каждый раз, когда он выходит на передний план. Я использую следующий код в ViewDidLoad, который, кажется, работает нормально.NotificationCenter addObserver

NotificationCenter.default.addObserver(self, selector: #selector(ViewController.updateDisplay), name: NSNotification.Name.UIApplicationWillEnterForeground, object: nil) 

Нужно ли снимать наблюдателя в любой момент?

+0

Вот интересное видео о наблюдателях «NotificationCenter». Они обсуждают альтернативный подход к их удалению ближе к концу: https://talk.objc.io/episodes/S01E27-typed-notifications-part-1 – ganzogo

+0

@humanoid: Сунил Чаухан был абсолютно прав, вы можете принять его ответ. Пробовал код на устройстве iOS 9 и понял, что центр уведомлений не будет запускать метод на деинированном объекте! Протестированы как основанные на методе, так и блочные API в iOS 9 и iOS 10, оба работают абсолютно нормально. Вам больше не нужно удалять наблюдателя –

ответ

0

Вы можете позвонить по телефону NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIApplicationWillEnterForeground, object: nil) по телефону viewWillDisappear. Но это приведет к удалению наблюдателя при перемещается от этого экрана к другому, так что если вы хотите добавить наблюдатель снова для этого экрана переместить ваш

NotificationCenter.default.addObserver(self, selector: #selector(ViewController.updateDisplay), name: NSNotification.Name.UIApplicationWillEnterForeground, object: nil) в viewWillAppear

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

+0

Открывает ли viewWillAppear при выходе из фона? – Humanoid

+0

Да, когда вы находитесь на том же контроллере, где вы добавили уведомление, первое приложение действительно вводит передний план, вызывается, а затем viewWIllAppear – Pushkraj

-1

Я думаю, вы должны использовать приложение AppDelegateWillEnterForeground, чтобы сигнализировать об этом вашим ViewControllers. Нет необходимости в участии NotificationCenter на всех

+0

applicationWillEnterForeground выполняется, когда приложение будет выходить на передний план. Однако, чтобы иметь возможность вносить изменения в VC, наиболее эффективно уведомлять VC с уведомлением. Однако вы не всегда уверены, что VC активен в то время. Поэтому решение от Sandeep Bhandari звучит логичнее. – Vincent

1

Начиная с iOS 9.0, вам не нужно удалять наблюдателей. Есть взгляд на этой release note:

В OS X 10.11 и прошивке 9.0 NSNotificationCenter и NSDistributedNotificationCenter больше не будут посылать уведомления зарегистрированных наблюдателей, которые могут быть высвобождены. Если наблюдатель может быть сохранен как ссылка с низким уровнем обнуления, базовое хранилище будет хранить наблюдателя как слабое задание обнуления, альтернативно, если объект не может быть сохранен слабо (т. Е. Он имеет собственный механизм сохранения/освобождения, который предотвратит время выполнения от возможности слабо хранить объект), он сохранит объект в качестве несимметричной ссылки на обнуление. Это означает, что наблюдатели не обязаны отказываться от регистрации в методе их освобождения. Следующее уведомление, которое будет направлено этому наблюдателю, обнаружит нулевую ссылку и автоматически отменяет регистрацию наблюдателя. Если объект может быть слабо указан, уведомления больше не будут отправляться наблюдателю во время освобождения; предыдущее поведение приема уведомлений во время dealloc все еще присутствует в случае нештатных обнуляющих опорных наблюдателей. Наблюдатели на основе блоков с помощью метода [NSNotificationCenter addObserverForName: object: queue: usingBlock] по-прежнему должны быть незарегистрированы, когда они больше не используются, поскольку система по-прежнему имеет сильную ссылку на этих наблюдателей. По-прежнему поддерживается снятие наблюдателей (либо слабо ссылка, либо ссылка на нуль). CFNotificationCenterAddObserver не соответствует этому поведению, поскольку наблюдатель может не быть объектом.

+1

Очень хорошее наблюдение, Узнали что-то новое сегодня! Если бы я мог, я бы принял это как ответ, я все равно не могу голосовать: D –