尝试移除KVO观察者时崩溃

时间:2017-04-29 00:57:32

标签: swift swift3 key-value-observing

我第一次实现了KVO,并且在某些条件下,它正在工作,并且正在调用observeValue。但是,在尝试删除deinit中的观察者时,我遇到了崩溃:

  

无法移除观察者    对于   关键路径" downloadInProgress"从      因为它没有注册为观察员。

...虽然我确实在viewDidLoad注册了对象。

// At the top of my file
dynamic var downloadInProgress: Bool = false


override func viewDidLoad() {
    super.viewDidLoad()
    self.addObserver(self, forKeyPath:  #keyPath(downloadInProgress), options: [.old,.new], context: nil)
}

deinit {
    // It crashes here
    removeObserver(self, forKeyPath: #keyPath(downloadInProgress))
}

基本上如果downloadInProgress = false,它会崩溃。我究竟做错了什么?谢谢。

1 个答案:

答案 0 :(得分:0)

你写了

// At the top of my file
dynamic var downloadInProgress: Bool = false

所以它不是一个对象的一部分?如果是这样可能是问题。 KeyValueObserving是ObjectiveC的技术。在Swift中有一些限制。一个限制是它只适用于从NSObject派生的类。如果它是一个全局变量,我预计这不会实现。

Apple documentation

  

只要该类继承自NSObject类,就可以对Swift类使用键值观察

如果你有一个像这样的kvo对象,它应该可以工作:

final class MyObject: NSObject {
   dynamic var downloadInProgress: Bool = false
}

self.addObserver(self, forKeyPath:  #keyPath(myobjectinstance.downloadInProgress), options: [.old,.new], context: nil)

提示:将来要避免使用KVO,因为它在swift中并不常见。