删除观察者通知 Swift 3

Ahm*_*ine 2 notifications uiviewcontroller swift3

我使用 Kugel 库进行通知(https://github.com/TakeScoop/Kugel/tree/swift-3.0)。我想知道如何删除 Observer 以及在我的代码中的位置。我为图书馆使用取消订阅,但没有任何反应

覆盖 func viewDidDisappear(_ 动画:布尔){

    super.viewDidDisappear(animated)
    Kugel.unsubscribe("SleepMode")
    Kugel.unsubscribe("SleepModeSynchroMode")
    Kugel.unsubscribe(self, name: NSNotification.Name(rawValue: "SleepMode"), object: nil)
    Kugel.unsubscribe(self, name: NSNotification.Name(rawValue: "SleepModeSynchroMode"), object: nil)
    NotificationCenter.default.removeObserver(self, name: Notification.Name(rawValue: "SleepMode"), object: nil);
    NotificationCenter.default.removeObserver(self, name: Notification.Name(rawValue: "SleepModeSynchroMode"), object: nil);
}
Run Code Online (Sandbox Code Playgroud)

当我回到其他视图时,我想删除订阅通知(添加观察者)。我使用 denit { } 但没有杀死的通知。

你能帮助我吗

塔克斯

小智 5

那都是错的。这是在 Swift 中删除观察者的正确方法(也适用于 Obj-C):根据 Apple 的文档,您必须保留对观察者的引用!NSNotificationCenter addObserver Self 不是观察者,所以NotificationCenter.default.removeObserver(self, name: Notification.Name(rawValue: "SleepMode"), object: nil);什么都不做。你需要做的是:

  1. 为您的通知扩展 Notification.Name:(您发布通知的位置)

    extension Notification.Name {
      static let notification = Notification.Name(rawValue: "A notification")
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用以下命令创建对观察者的弱引用:

    weak var observer: NSObjectProtocol?
    
    Run Code Online (Sandbox Code Playgroud)
  3. 创建一个“addObserver”函数,如下所示:(你想在那里收听通知)

    func addObserver() {
      guard observer == nil else { return }
      observer = NotificationCenter.default.addObserver(forName: .notification,
                                                         object: nil,
                                                          queue: .main) { notification in
        print("Notification triggered")
    }
    
    Run Code Online (Sandbox Code Playgroud)
  4. 创建一个“removeObserver”函数:

    func removeObserver() {
      guard let observer = observer else { return }
      NotificationCenter.default.removeObserver(observer)
    }
    
    Run Code Online (Sandbox Code Playgroud)
  5. 从代码中需要的任何位置调用“addObserver”函数(很可能来自您的viewDidLoad方法)

  6. 收听完通知后调用“removeObserver”函数。

这里的重要一点是,如果您对实现通知的类有一个额外的强引用,并且您“认为”观察者已被删除,但事实并非如此,那么guard上面的实现会阻止您的代码创建多个观察者。对于viewDidLoad缺少 a的函数中 addObserver 的某些实现尤其如此removeObserver。证明?在功能的addObserver在您指定的观察员和编辑断点(右键)然后选择行添加一个断点add action,并挑选Sound和选择选项Automatically continue after evaluating actions

在此处输入图片说明

启动您的应用程序并在实现观察者的视图中来回切换。如果您听到声音的次数是恒定的,那么您就完成了!否则,每次进入视图时,此处的声音都应增加 1。你去吧!