应该在iOS中使用removeObserver(self)删除通知吗?

问题描述 投票:0回答:2

应该在iOS中使用self删除通知吗?

[队友已在viewWillAppear中注册了通知,并在viewDidDisappear中将其删除,],>

override func viewWillAppear(_ animated: Bool) {
    NotificationCenter.default.addObserver(self, selector: #selector(onDidReceiveData(_:)), name: .didReceiveData, object: API.shared)
}

override func viewDidDisappear(_ animated: Bool) {
    NotificationCenter.default.removeObserver(self)
}

虽然我评论并建议使用显式名称

删除通知,而不是使用self删除,因为我认为将来可能需要在viewWillLoad中注册一些其他通知,但不应受调用NotificationCenter.default.removeObserver(self)的意外或开发人员错误的影响。我的建议是使用删除观察者,
override func viewDidDisappear(_ animated: Bool) {
    NotificationCenter.default.removeObserver(self, name:.didReceiveData, object: nil)
}

队友回答说,用NotificationCenter.default.removeObserver(self)删除完全可以,因为我们暂时不注册其他通知。我正在寻求参考或指导以说服他,为什么重要的是使用名称而不是self来显式删除通知。

Apple是否有有关删除通知观察者的最佳做法的准则?

应该在iOS中使用self删除通知吗?队友已在viewWillAppear中注册了一个通知,并在viewDidDisappear中将其删除,例如,覆盖了func viewWillAppear(_ animation:Bool){...

ios swift design-patterns notifications nsnotificationcenter
2个回答
0
投票

在iOS 9之后,无需删除观察者,因为iOS将从已分配的ViewController中移除观察者


0
投票

事实是,将来删除viewWillDisappear中的所有通知并不安全。出于明显的原因,这不是一个好习惯,但是没有记录。在iOS 9之后,无需调用removeObserver,因为iOS不会尝试通知已释放的对象。就您而言,即使视图控制器不可见但出现在导航堆栈中,您也想收听您应该在deinit中执行>

    class ViewController: UIViewController {
    deinit {
     NotificationCenter.default.removeObserver(self, name:.didReceiveData, object: nil)
    }
   }
© www.soinside.com 2019 - 2024. All rights reserved.