如何读取通知观察者

How to readd a notification observer

所以我在一个特定的视图控制器中添加了大约四个通知观察器,但我想特别是在满足条件时删除一个,然后在不同的条件下将其添加回去。我能够删除特定的观察者,但我无法将其添加回去。其他的工作,除了一个被删除并添加回来的,我知道它在 VC 加载和添加所有通知观察者时工作,但在添加回来后它停止工作。这是我的代码:


// registered the observer in ViewDIdAppear and this registers my bluetooth device and whenever i tap on the bluetooth device button this function gets called
NotificationCenter.default.addObserver(
    self, selector: #selector(Myclass.deviceTapped), name: Notification.Name("bluetoothRecievedNoticicationName"), object: nil)

// i removed the observer here 
 if condition == false {
          NotificationCenter.default.removeObserver(self, name:  Notification.Name("bluetoothRecievedNoticicationName"), object: nil)

}  

// and then use this to add it back again 
NotificationCenter.default.addObserver(
    self, selector: #selector(Myclass.deviceTapped), name:  Notification.Name("bluetoothRecievedNoticicationName"), object: nil)

// and after adding this ^ back the deviceTapped function doesn't get called anymore

在这些情况下要做的是向自己证明这 确实 通常有效。这样一来,您就可以追踪到正在做的事情阻止了它的工作。

例如,也许 self 在任何通知有机会到达之前就已经不存在了...?也许您还没有显示的其他一些代码正在再次注销您...?我当然经历过这样的困惑!而且它们很难调试。

但无论是什么解释,您首先需要确保取消注册通知然后重新注册不是问题。

这是一个测试应用程序。它具有三个按钮:Register、Unregister 和 Notify。这是代码:

let notif : Notification.Name = .init("howdy")
@objc func gotNotified() {
    print("got notified")
}
@IBAction func doRegister(_ sender: Any) {
    NotificationCenter.default.addObserver(self, selector: #selector(gotNotified), name: notif, object: nil)
}
@IBAction func doUnregister(_ sender: Any) {
    NotificationCenter.default.removeObserver(self, name: notif, object: nil)
}
@IBAction func doNotify(_ sender: Any) {
    NotificationCenter.default.post(name: notif, object: nil)
}

所以配置好按钮,然后:

  1. 点击注册。

  2. 点击通知。

  3. 点击取消注册。

  4. 点击通知。

  5. 点击注册。

  6. 点击通知。

您会看到,在 2 和 6,而不是 4,我们打印到控制台以证明我们已收到通知 — 正如您所期望的那样。