在swift4.0 中 KVO 出現(xiàn)了變更,添加了監(jiān)聽回調(diào).變得更加簡單易用.同時(shí)會自動釋放.不用再remove了.但是相對于OC中使用來說還是有一些需要注意的地方.
1. 需要在當(dāng)前類中添加一個屬性來持有
NSKeyValueObservation 否則在函數(shù)執(zhí)行完畢后將會被釋放
2. 被監(jiān)聽的類需要用 @objcMembers 修飾,否則會報(bào)錯
3. 你需要監(jiān)聽哪個屬性,則該屬性需要 dynamic 修飾,否則不會觸發(fā)回調(diào)
舉個簡單的例子.一個用于被監(jiān)聽的模型
@objcMembers?class?UserModel :?NSObject?{
?dynamic?var name :?String =?""
?var age :?Int =?0
}
?注意: 1.該UserModel被?@objcMembers 修飾.
? ? ? 2.模型中的屬性 name 被?dynamic 修飾, 可被監(jiān)聽. 而 age 則無法被監(jiān)聽,如果想要監(jiān)聽 age 則同樣需要用?dynamic 進(jìn)行修飾
KVO的使用
1.在一個類中(如ViewController)我們添加一個屬性?
var model : UserModel! = {
?var model = UserModel.init()
model.name =?"張三"?
model.age = 20
?return model
? ? }()
2. 在類中再添加一個屬性?
var?ob : NSKeyValueObservation?
來持有 監(jiān)聽?NSKeyValueObservation
然后寫一個方法并且在合適的地方調(diào)用
func setupKVO() {
// 注意這里用self.ob來持用該監(jiān)聽 model為需要監(jiān)聽的類實(shí)例.調(diào)用時(shí)需要確保其不為nil?
self.ob =?model!.observe(\UserModel.name) { (model, change)?in
print("model.name")
? ? ? ? }
? ? }
這樣.當(dāng) model.name 的值改變時(shí)就會觸發(fā)回調(diào)