KVO,也就是键值观察者模式,我们有两种方式来实现它,OC的和非OC的。首先我们实现OC的形式。
第一步:创建一个类KVOClass,然后再定义一个可以被观察的属性,这个属性需要用@objc dynamic来修饰
import UIKit
class KVOClass: NSObject {
@objc dynamic var name: String = "xiaoming"
}第二部:在对应的地方调用他
class ViewController: UIViewController {
var ob : NSKeyValueObservation?
let kvc: KVOClass = KVOClass()
override func viewDidLoad() {
super.viewDidLoad()
ob = kvc.observe(\KVOClass.name,
options: [.old, .new],
changeHandler: { [weak self] (KVOClass, change) in
if let oldName = change.oldValue {
print("旧名字是---\(oldName)")
}
if let newName = change.newValue {
print("新名字是---\(String(describing: self?.kvc.name))-----\(newName)")
}
})
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
kvc.name = "xiaoli"
}
}Swift原生的willSet和didSet就是最直接的键值观察,代码也非常简单。
class KVOClass: NSObject {
@objc dynamic var name: String = "xiaoming"
//使用可选类型纯粹是我懒 不想写初始化器 😄
var age: Int? {
willSet {
print("\(newValue ?? 0)")
}
didSet {
print("\(oldValue ?? 0)-----\(age ?? 0)")
}
}
}这就是我们在Swift里面实现KVO的两种方式,推荐大家用第二种,简单又好用,第一种纯粹是OC的思维去实现的,以后如果更多接触Swift的话,不推荐第一种。