Swift - 通知观察者被多次调用

时间:2015-08-18 15:50:08

标签: ios swift nsnotificationcenter

我有viewController,在viewDidLoad里面我有

NSNotificationCenter.defaultCenter().addObserver(self, selector: "showNextQuestions", name: "showNextQuestionsID", object: nil)

在另一个控制器中我有

NSNotificationCenter.defaultCenter().postNotificationName("showNextQuestionsID", object: nil)

如果我从应用程序回家并再次启动它,则showNextQuestionID会触发两次。

我尝试使用

func applicationDidEnterBackground(application: UIApplication) {
    NSNotificationCenter.defaultCenter().removeObserver(self, name: "showNextQuestionsID", object: nil)
}

但这没有帮助,

和viewController

deinit {
    NSNotificationCenter.defaultCenter().removeObserver(self)
}

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

您没有在正确的位置删除通知观察者。您在视图控制器子类中注册观察者,并且需要在同一个类中删除它。一个合理的位置是覆盖viewWillDisappear方法。将以下代码放在视图控制器子类中:

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    NSNotificationCenter.defaultCenter().removeObserver(self)
}

同时删除

 NSNotificationCenter.defaultCenter().removeObserver(self, name: "showNextQuestionsID", object: nil)

来自您的AppDelegate。当你提供自我' AppDelegate中的参数,它指的是AppDelegate类,而不是您的视图控制器。当您在视图控制器sublcass中调用删除通知观察者时,self是您的视图控制器,这就是您想要的。

最后,当您只调用removeObserver(self)而没有其他参数时,它将取消注册该对象的所有观察者。这样你就不必通过名字列出每个观察者。

答案 1 :(得分:0)

将观察者放在AppDelegate或单例中,以便在应用程序状态期间轻松添加和删除观察者。

答案 2 :(得分:0)

applicationDidEnterBackgrounddeinit应该没问题。

问题在于您尝试删除applicationDidEnterBackground中的观察者的方式。您正试图从AppDelegate中删除观察者,您需要从ViewController中删除观察者。

解决问题:

1)在视图控制器中监听UIApplicationDidEnterBackgroundNotification:

func init() {
  super.init()

  NSNotificationCenter.defaultCenter().addObserver(self, selector: "myAppDidEnterBackground", name: UIApplicationDidEnterBackgroundNotification, object: nil) 
}

2)实施听取UIApplicationDidEnterBackgroundNotification

的方法
func myAppDidEnterBackground() {
NSNotificationCenter.defaultCenter().removeObserver(self, name: "showNextQuestionsID", object: nil)
}

3)额外。您还可以收听UIApplicationWillEnterForegroundNotification,以便再次添加自定义通知