KVO,即:Key-Value Observing,它提供一種機制,當指定的對象的屬性被修改後,則對象就會接受收到通知。簡單的說就是每次指定的被觀察的對象的屬性被修改後,KVO就會自動通知相應的觀察者了。
對於誇界面修改實例屬性的,我們會利用到kvo來監聽值變化,並顯示在界面上,去除NotificationCenter通知的臃腫代碼和閱讀障礙。
使用kvo時,注意在界面銷燬,移除監聽,把指針置空,避免野指針引起崩潰。
kvo代碼如下:
var kvObservr:NSKeyValueObservation!
override func viewDidLoad() {
super.viewDidLoad()
self.adminNameLabel.text = AppCache.shared.accountModel!.nickName ?? account
kvObservr = AppCache.shared.accountModel!.observe(\.nickName, options: [.old,.new], changeHandler: {[weak self] (model, change) in
if let newValue = change.newValue{
self?.adminNameLabel.text = newValue ?? AppCache.shared.account
}
})
}
deinit {
print("銷燬")
deinitTheObserve()
}
func deinitTheObserve(){
kvObservr?.invalidate()
kvObservr = nil
}
被監聽model中的屬性必須用@objc dynamic修飾,
使用dynamic關鍵字標記屬性,使屬性啓用Objc的動態轉發功能;
dynamic只用於類,不能用於結構體和枚舉,因爲它們沒有繼承機制,而Objc的動態轉發就是根據繼承關係來實現轉發。
代碼:
class AccountModel: NSObject{
var accountID: String?
var theInitPassword:String? //初始密碼
var password: String?
@objc dynamic var nickName: String?
override init() {
super.init()
}
}