swift中KVO的使用
2021-02-07 本文已影响0人
90后的晨仔
KVO底层原理
NSObject
基类中默认遵守了NSKeyValueCoding
协议,所以我们在使用KVO的时候必须是基于NSObject
才能正常使用。在使用oc开发的时候由于我们在创建的类默认会继承NSObject
所以可以直接使用KVO,但是在swift中我们必须手动显示的继承NSObject
类,并且还需要添加@objc dynamic
两个关键字修饰否则无法使用。
方法一:个人感觉与使用oc时候的用法还是蛮类似的。
class KVOClass:NSObject {
@objc dynamic var currentValue: String = "我可以被监听"
var otherValue: String = "我不能被监听"
}
class ObserverClass: NSObject {
override init() {
super.init()
print("ObserverClass init")
self.observer()
}
let kvo = KVOClass()
func observer() {
kvo.addObserver(self, forKeyPath: "currentValue", options: .new, context: nil)
kvo.addObserver(self, forKeyPath: "otherValue", options: .new, context: nil)
kvo.currentValue = "码农晨仔1"
kvo.otherValue = "码农晨仔2"
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
print("\(keyPath!) change to \(change![.newKey] as! String)")
}
deinit {
print("ObserverClass dealloc")
kvo.removeObserver(self, forKeyPath: "currentValue")
kvo.removeObserver(self, forKeyPath: "otherValue")
}
}
ObserverClass()
方法二:比较简洁的一个使用方法。
class KVOTestClass: NSObject {
@objc dynamic var name: String?
var ob: NSKeyValueObservation?
override init() {
super.init()
name = "你好"
ob = self.observe(\KVOTestClass.name, options: [.new, .old]) { (_, change) in
print(change)
}
print("KVOTestClass init")
}
deinit {
print("KVOTestClass dealloc")
}
}
var kvoTestObj: KVOTestClass? = KVOTestClass()
kvoTestObj?.name = "码农晨仔"
kvoTestObj = nil
总结:
1.必须显示继承NSObject
。
2.必须使用@objc dynamic
修饰,否则无效。
3.demo地址
4.CSDN