我使用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);
}


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

你能帮助我吗

塔恩克斯

最佳答案

都错了。这是在Swift中删除观察者的正确方法(也适用于Obj-C):
根据Apple的文档,您必须保留对观察者的参考! NSNotificationCenter addObserver自己不是观察者,所以NotificationCenter.default.removeObserver(self, name: Notification.Name(rawValue: "SleepMode"), object: nil);不执行任何操作。
您要做的是:


扩展通知的Notification.Name :(在其中发布通知)

extension Notification.Name {
  static let notification = Notification.Name(rawValue: "A notification")
}

通过以下方式为观察者创建弱引用:

weak var observer: NSObjectProtocol?

创建一个“ addObserver”函数,如下所示:(您要在其中收听通知的地方)

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

创建一个“ removeObserver”函数:

func removeObserver() {
  guard let observer = observer else { return }
  NotificationCenter.default.removeObserver(observer)
}

在代码中任何需要的地方调用“ addObserver”函数(很可能是从viewDidLoad方法调用)
听完该通知后,调用“ removeObserver”函数。


这里重要的一点是,如果您对实现通知的类有更强的引用,并且您“认为”观察者已删除,但没有删除,则上述guard实现将阻止您的代码创建多个观察者。对于viewDidLoad函数中缺少removeObserver的addObserver的某些实现,尤其如此。
证明?在分配观察者并编辑断点的行上,在addObserver函数中添加一个断点(右键单击),然后选择add action并选择Sound并选择选项Automatically continue after evaluating actions

uiviewcontroller - 删除观察者通知Swift 3-LMLPHP

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

关于uiviewcontroller - 删除观察者通知Swift 3,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42155733/

10-13 04:19