ios - 即使我在 viewWillAppear 中注册并在 viewWillDissapear 中注销,观察者方法也会被多次调用

标签 ios swift swift4 nsnotificationcenter

即使我在 viewWillAppear 中注册并在 viewWillDissapear 中取消注册,观察者方法也会被多次调用。

override func viewWillAppear(_ animated: Bool) {
    NotificationCenter.default.addObserver(self,
                                           selector: #selector(handlePushNotification(notification:)),
                                           name: NSNotification.Name(rawValue: "abc"),
                                           object: nil)

override func viewWillDisappear(_ animated: Bool) {
    NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: "abc"), object: nil)
}

最佳答案

对于具有属性观察者的成员变量来说,这是一个很好的用例:只需使通知观察者成为 View Controller 子类的成员,并在 willSet block 内处理通知观察者的清理:

class MyViewController: UIViewController {

    var notificationObserver: Any? {
        willSet {
            // if notificationObserver is not null, unregister it
            if let observer = notificationObserver {
                NotificationCenter.default.removeObserver(observer)
            }
        }
    }

    override func viewWillAppear(_ animated: Bool) {
        notificationObserver = NotificationCenter.default.addObserver(self,
                                       selector: #selector(handlePushNotification(notification:)),
                                       name: NSNotification.Name(rawValue: "abc"),
                                       object: nil)
    }

    override func viewWillDisappear(_ animated: Bool) {
        notificationObserver = nil
    }

}

这将确保在创建新观察者时,现有观察者始终处于未注册状态。

如果您仍然收到多个回调,则意味着通知已发送多次。

关于ios - 即使我在 viewWillAppear 中注册并在 viewWillDissapear 中注销,观察者方法也会被多次调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52780178/

相关文章:

objective-c - 在 Objective-C 开发中从 iOS 迁移到 Mac 时,NSIntegers 给出类型匹配错误

ios - UIPickerView 为空,数据源为 JSON 数组

swift - 调用 insertNewObjectForEntityForName(_ :, inManagedObjectContext: ) 时使用未声明的类型

ios - 如何通过 Swift 中的 ContainerView 更改 TableView 中项目的属性?

ios - 将具有泛型子类类型约束的对象传递给方法时出现 Swift 编译时错误

ios - UISearchBar with statusbar animation transition bug ios7

swift - 如何声明重抛函数?

ios - 委托(delegate)和数据源不与 UIPickerViewDelegate 一起工作

macos - Swift 4 中的 NSAccessibilityRadioButton 实现

ios - 如何在 swift 4 中通过 SwiftyJson 和 Alamofire 创建多个按钮?