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