删除观察者通知Swift 3

时间:2017-02-10 09:24:05

标签: uiviewcontroller notifications swift3

我使用Kugel Library进行通知(https://github.com/TakeScoop/Kugel/tree/swift-3.0)。我想知道如何删除Observer以及我的代码中的位置。我使用Unsubscribe库,没有任何反应

覆盖func viewDidDisappear(_ animated:Bool){

    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);
}

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

你能帮忙吗

Tahnks

3 个答案:

答案 0 :(得分:4)

一切都是错的。这是在Swift中删除观察者的正确方法(也适用于Obj-C): 根据Apple的文档,你必须保留对观察者的参考! NSNotificationCenter addObserver自我不是观察者,因此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")
    }
    
  2. 使用以下命令为您的观察者创建弱引用:

    weak var observer: NSObjectProtocol?
    
  3. 创建" addObserver"功能如下:(你想听通知的地方)

    func addObserver() {
      guard observer == nil else { return }
      observer = NotificationCenter.default.addObserver(forName: .notification,
                                                         object: nil,
                                                          queue: .main) { notification in
        print("Notification triggered")
    }
    
  4. 创建" removeObserver"功能:

    func removeObserver() {
      guard let observer = observer else { return }
      NotificationCenter.default.removeObserver(observer)
    }
    
  5. 致电您的" addObserver"在您的代码中从您需要的任何地方运行(很可能来自您的viewDidLoad方法)

  6. 调用" removeObserver"完成收听通知后的功能。

  7. 这里重要的一点是,如果您对实施通知的班级有更强的参考,那么您认为"观察者被移除但事实并非如此,那么上面的guard实现会阻止您的代码创建多个观察者。对于viewDidLoad函数中缺少removeObserver的addObserver的某些实现,情况尤其如此。 证明?在addObserver函数中为您指定观察者的行添加一个断点并编辑断点(右键单击),然后选择add action并选择Sound并选择Automatically continue after evaluating actions选项。

    enter image description here

    启动您的应用并在实现观察者的视图中来回移动。如果您听到声音的时间不变,那么您就完成了!否则,每次进入视图时,声音都应增加1。你去吧!

答案 1 :(得分:3)

如果您的应用面向iOS 9.0及更高版本或macOS 10.11及更高版本,则无需在其取消分配方法中取消注册观察者。如果您的应用程序定位于早期版本,则需要保留对observer对象的引用并提交它而不是“self”,同时库也说它已弃用,为什么要使用它?

答案 2 :(得分:0)

尝试并删除viewWillAppear中的观察者