我有这个代码,取自这个答案: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)
}
然而,即使使用此扩展,在添加之前删除观察者,每次我退出视图控制器并返回它时,我会收到多个通知(每次一个额外的通知)。
这怎么可能?
答案 0 :(得分:1)
如果您需要此setObserver
扩展名,那么您很可能会做错事。您应该能够轻松平衡注册和删除。如果你不能,你的通知管理很可能太复杂或错误。
通常情况下,添加观察结果的正确位置位于viewWillAppear
(或viewDidAppear
,两者都可以),并在viewDidDisappear
(或viewWillDisappear
)中将其删除。这可确保您在屏幕外时不会收到通知,即使视图控制器仍然存在(这很常见)。
如果您的视图控制器要求它在屏幕外接收通知,那么您遇到了设计问题。视图控制器应仅管理屏幕视图。如果他们正在做其他事情,那么你已经将太多的模型放入了控制器中。
正如@rmaddy所说,您的具体问题可能是您有两个此视图控制器的实例。这可能没问题,也可能是错误的(这取决于视图控制器的工作方式)。但是,如果你在屏幕上和屏幕外平衡添加和删除注册,那么这部分就可以了。