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

时间:2016-12-12 17:00:42

标签: swift swift2 nsnotificationcenter

我有这个代码,取自这个答案:https://stackoverflow.com/a/29099066/406322

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)
}

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

这怎么可能?

1 个答案:

答案 0 :(得分:1)

如果您需要此setObserver扩展名,那么您很可能会做错事。您应该能够轻松平衡注册和删除。如果你不能,你的通知管理很可能太复杂或错误。

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

如果您的视图控制器要求它在屏幕外接收通知,那么您遇到了设计问题。视图控制器应仅管理屏幕视图。如果他们正在做其他事情,那么你已经将太多的模型放入了控制器中。

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