前言
之前仿写 Object-C 版 KVOContrller 编写的 swift版 KVOContrller,浪费了一番功夫,发现系统自带观察者observe,其使用起来和 KVOController一样,观察者生命周期与持有者一个生命周期,
因此:扔了KVOController吧,其就是一个系统自带的纯粹的Swift版本的KVOController,(swift5完全适用)下面介绍一下其使用
class TestModel: NSObject {
//被观察的属性需使用 objc 声明,以标识 objc
@objc dynamic var name: String = ""
@objc dynamic var age: Int = 0
//NSString也可以用,碰到String有问题时可以用 NSString
@objc dynamic var alias: NSString = ""
}
class ViewController: UIViewController {
var testModel = TestModel()
//var kvo: Foundation.NSKeyValueObservation? //observe返回的类型打印就是这个,其实Any即可
var kvo: Any?
override func viewDidLoad() {
super.viewDidLoad()
self.kvo = self.testModel.observe(\.name, options: .new) { [weak self](testModel, changed) in
print(changed)
self?.testModel.age = 10
}
testModel.name = "哈哈哈";
let btn = UIButton(frame: CGRect(x: 50, y: 100, width: 100, height: 100))
btn.setTitle("跳转", for: .normal)
btn.setTitleColor(UIColor.black, for: .normal)
btn.addTarget(self, action: #selector(onClickToPush), for: .touchUpInside)
self.view.addSubview(btn)
}
@objc func onClickToPush() {
self.present(ViewController(), animated: true)
}
deinit {
print("ViewController-dealloc")
}
}
使用很简单,使用属性保存 observe 范返回的对象即可,这样观察者会随着其释放而释放,想要提前移除直接将该对象置空即可