NotificationCenter addObserver

时间:2016-12-13 11:15:32

标签: ios swift

我想在每次进入前台时更新我的​​应用程序的显示。我在ViewDidLoad中使用以下代码似乎工作正常。

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

我是否需要随时删除观察者?

3 个答案:

答案 0 :(得分:2)

从iOS 9.0开始,您不需要删除观察者。看看这个release note:

  

在OS X 10.11和iOS 9.0中,NSNotificationCenter和NSDistributedNotificationCenter将不再向可能已解除分配的已注册观察者发送通知。如果观察者能够存储为归零弱引用,则底层存储将把观察者存储为归零弱引用,或者如果对象不能被弱存储(即它具有可以阻止运行时的自定义保留/释放机制)从能够弱对象存储对象,它将对象存储为非弱的归零引用。这意味着观察者不需要在他们的释放方法中取消注册。将被路由到该观察者的下一个通知将检测归零的引用并自动取消注册观察者。如果一个对象可以被弱引用,则在重新分配期间将不再向观察者发送通知;在非弱调零参考观察者的情况下,在dealloc期间接收通知的先前行为仍然存在。基于块的观察者通过 - [NSNotificationCenter addObserverForName:object:queue:usingBlock]方法仍然需要在不再使用时取消注册,因为系统仍然拥有对这些观察者的强引用。仍然支持过早删除观察者(弱引用或引用归零)。 CFNotificationCenterAddObserver不符合此行为,因为观察者可能不是对象。

答案 1 :(得分: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

删除它总是很好的做法,否则只要您的屏幕处于堆叠状态且应用程序出现在前台,它就会尝试一次又一次地调用该方法。

答案 2 :(得分:-1)

我认为你应该使用AppDelegate的applicationWillEnterForeground向你的ViewControllers发出信号。根本不需要NotificationCenter参与