如何读取通知观察者
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)
}
所以配置好按钮,然后:
点击注册。
点击通知。
点击取消注册。
点击通知。
点击注册。
点击通知。
您会看到,在 2 和 6,而不是 4,我们打印到控制台以证明我们已收到通知 — 正如您所期望的那样。
所以我在一个特定的视图控制器中添加了大约四个通知观察器,但我想特别是在满足条件时删除一个,然后在不同的条件下将其添加回去。我能够删除特定的观察者,但我无法将其添加回去。其他的工作,除了一个被删除并添加回来的,我知道它在 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)
}
所以配置好按钮,然后:
点击注册。
点击通知。
点击取消注册。
点击通知。
点击注册。
点击通知。
您会看到,在 2 和 6,而不是 4,我们打印到控制台以证明我们已收到通知 — 正如您所期望的那样。