swift自带KVO使用(扔了KVOController吧)

504 阅读1分钟

前言

之前仿写 Object-CKVOContrller 编写的 swiftKVOContrller,浪费了一番功夫,发现系统自带观察者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 范返回的对象即可,这样观察者会随着其释放而释放,想要提前移除直接将该对象置空即可