我第一次实现了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
,它会崩溃。我究竟做错了什么?谢谢。
答案 0 :(得分:0)
你写了
// At the top of my file
dynamic var downloadInProgress: Bool = false
所以它不是一个对象的一部分?如果是这样可能是问题。 KeyValueObserving是ObjectiveC的技术。在Swift中有一些限制。一个限制是它只适用于从NSObject派生的类。如果它是一个全局变量,我预计这不会实现。
只要该类继承自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中并不常见。