Swift实现KVO的两种方式
2020-07-17 本文已影响0人
林夕copy
KVO 即 Key-Value Observing,翻译成键值观察。它是一种观察者模式的衍生。其基本思想是,对目标对象的某属性添加观察,当该属性发生变化时,通过触发观察者对象实现的KVO接口方法,来自动的通知观察者。
简单来说KVO可以通过监听key,来获得value的变化,用来在对象之间监听状态变化。KVO的定义都是对NSObject的扩展来实现的,Objective-C中有个显式的NSKeyValueObserving类别名,所以对于所有继承了NSObject的类型,都能使用KVO(一些纯Swift类和结构体是不支持KVC的,因为没有继承NSObject)。详情可以参考:KVC/KVO详解
创建一个被观察的对象
class ATKVOModel: NSObject {
// dynamic需要的加上@objc
@objc dynamic var name: String = ""
}
第一种方式:
var model = ATKVOModel()
// 添加观察者(self需要继承NSObjetc)
model.addObserver(self, forKeyPath: "name", options: [.new, .old], context: nil)
// 重写响应方法
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
print(keyPath) // name
if let old = change?[NSKeyValueChangeKey.oldKey] {
print(old) //
}
if let new = change?[NSKeyValueChangeKey.newKey] {
print(new) // Albert
}
}
// 修改model的值
model.name = "Albert"
第二种方法:
var model = ATKVOModel()
var observer: NSKeyValueObservation?
observer = model.observe(\ATKVOModel.name, options: [.old, .new]) { (model, change) in
if let old = change.oldValue {
print(old) //
}
if let new = change.newValue {
print(new) // Albert
}
}
// 修改model的值
model.name = "Albert"
最后别忘了删除观察者
model.removeObserver(self, forKeyPath: "name")