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()
}
}