Swift 2 中删除通知观察者的正确位置在哪里?

Where is the right place to remove notification observers in Swift 2?

我有这段代码,取自这个答案:

extension NSNotificationCenter {
    func setObserver(observer: AnyObject, selector: Selector, name: String?, object: AnyObject?) {
        NSNotificationCenter.defaultCenter().removeObserver(observer, name: name, object: object)
        NSNotificationCenter.defaultCenter().addObserver(observer, selector: selector, name: name, object: object)
    }
}

现在,在我的视图控制器中,我在 viewDidLoad() 中设置我的观察者:

override func viewDidLoad() {
        super.viewDidLoad()
        setObservers()
}

func setObservers() {
        NSNotificationCenter.defaultCenter().setObserver(self, selector: #selector(BaseController.handleComment(_:)), name: "newComment", object: nil)
}

然而,即使使用这个扩展,观察者在添加之前被删除,每次我退出视图控制器,并且 return 到它,我都会收到多个通知(每次一个额外的)。

这怎么可能?

如果您需要这个 setObserver 扩展,您很可能做错了什么。您应该能够轻松地平衡您的注册和删除。如果做不到,很可能是你的通知管理太复杂或者位置不对。

通常添加观察的正确位置是在 viewWillAppear(或 viewDidAppear,两者都可以),并在 viewDidDisappear(或 viewWillDisappear)中删除它们。这确保您在屏幕外时不会收到通知,即使视图控制器仍然存在(这很常见)。

如果您的视图控制器要求它在屏幕外时接收通知,那么您就遇到了设计问题。视图控制器应该只管理屏幕视图。如果他们正在做任何其他事情,则说明您将过多的模型放入控制器中。

正如@rmaddy 指出的那样,您的具体问题可能是您有这个视图控制器的两个实例。这可能很好,也可能是一个错误(这取决于视图控制器的工作方式)。但是,如果你在屏幕上和屏幕外平衡添加和删除你的注册,那部分就没问题了。