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 指出的那样,您的具体问题可能是您有这个视图控制器的两个实例。这可能很好,也可能是一个错误(这取决于视图控制器的工作方式)。但是,如果你在屏幕上和屏幕外平衡添加和删除你的注册,那部分就没问题了。
我有这段代码,取自这个答案:
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 指出的那样,您的具体问题可能是您有这个视图控制器的两个实例。这可能很好,也可能是一个错误(这取决于视图控制器的工作方式)。但是,如果你在屏幕上和屏幕外平衡添加和删除你的注册,那部分就没问题了。