KVO 即 Key-Value Observing,翻譯成鍵值觀察。它是一種觀察者模式的衍生。其基本思想是,對目標(biāo)對象的某屬性添加觀察,當(dāng)該屬性發(fā)生變化時,通過觸發(fā)觀察者對象實現(xiàn)的KVO接口方法,來自動的通知觀察者。
簡單來說KVO可以通過監(jiān)聽key,來獲得value的變化,用來在對象之間監(jiān)聽狀態(tài)變化。KVO的定義都是對NSObject的擴展來實現(xiàn)的,Objective-C中有個顯式的NSKeyValueObserving類別名,所以對于所有繼承了NSObject的類型,都能使用KVO(一些純Swift類和結(jié)構(gòu)體是不支持KVC的,因為沒有繼承NSObject)。詳情可以參考:KVC/KVO詳解
創(chuàng)建一個被觀察的對象
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)
// 重寫響應(yīng)方法
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")