在Swift 4中,如何删除基于块的KVO观察者?

Gui*_*rme 26 key-value-observing swift swift4

如果我存储这样的观察者:

let observer: NSKeyValueObservation = foo.observe(\.value, options: [.new]) { (foo, change) in
    print(change.newValue)
}
Run Code Online (Sandbox Code Playgroud)

observer一旦我不再需要它,如何删除/禁用/清除?

我的foo实例没有remove接收NSKeyValueObservation实例的任何类似方法,它observer本身也没有任何remove类似的实例.

mat*_*att 31

在iOS 11中,您不必这样做.只是让观察者超出范围.让观察者在观察之前死亡或者让观察者在观察者面前死亡,不再有任何惩罚,所以你没有实际的工作要做.

另一方面,如果你真的取消注册观察者,将其从保留它的任何东西中删除,或告诉它invalidate.(必须保留它,因为如果你不坚持观察者,它将会死亡,你的观察者功能永远不会被调用.)

(你说"如果我存储一个这样的观察者",但你存储它的方式let是一种存储观察者的方式.最好把它放在一个Set中,你可以在以后删除它,或者至少将它存储在var您以后可以设置的Optional 中nil.)

  • 在发布了一个正在观察的AVPlayerItem之后,我刚刚在我的一个应用程序中发生了崩溃.所以在某些情况下你真的需要自己调用invalidate(). (7认同)
  • 你确实需要存储它,因为我在第二段给出了原因. (4认同)
  • 崩溃也可能是间歇性的,或者发生在一些代码路径中,我们没有想到测试.我不会做文件说不要做的事情.在这种情况下,我会取消注册所有观察者.谢谢你的帮助. (4认同)
  • @MilesEgan在iOS 11中? (3认同)
  • 不正确,因为我在第二段中给出了原因. (2认同)
  • 另外,它只是iOS 11的功能还是Xcode 9/Swift 3.2-Swift 4.0的功能?作为我正在开发的项目也支持iOS 10 (2认同)
  • @VaddadiKartick 请参阅 https://developer.apple.com/library/content/releasenotes/Foundation/RN-Foundation/index.html 和特别是。在“放宽键值观察注销要求”下 (2认同)