swift中KVO的使用

2021-02-07  本文已影响0人  90后的晨仔

KVO底层原理
NSObject基类中默认遵守了NSKeyValueCoding协议,所以我们在使用KVO的时候必须是基于NSObject才能正常使用。在使用oc开发的时候由于我们在创建的类默认会继承NSObject所以可以直接使用KVO,但是在swift中我们必须手动显示的继承NSObject类,并且还需要添加@objc dynamic两个关键字修饰否则无法使用。

方法一:个人感觉与使用oc时候的用法还是蛮类似的。

class KVOClass:NSObject {
   @objc dynamic var currentValue: String = "我可以被监听"
                 var otherValue: String = "我不能被监听"
}

class ObserverClass: NSObject {
    
    override init() {
        super.init()
         print("ObserverClass init")
        self.observer()
    }
    
    let kvo = KVOClass()
    func observer() {
        
        kvo.addObserver(self, forKeyPath: "currentValue", options: .new, context: nil)
        kvo.addObserver(self, forKeyPath: "otherValue", options: .new, context: nil)
        kvo.currentValue = "码农晨仔1"
        kvo.otherValue = "码农晨仔2"
       
    }
    
    
    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        print("\(keyPath!) change to \(change![.newKey] as! String)")
    }
    
    deinit {
         print("ObserverClass dealloc")
        kvo.removeObserver(self, forKeyPath: "currentValue")
        kvo.removeObserver(self, forKeyPath: "otherValue")
    }
}
 ObserverClass()


方法二:比较简洁的一个使用方法。

class KVOTestClass: NSObject {
    @objc dynamic var name: String?
    var ob: NSKeyValueObservation?
    override init() {
        super.init()
        name = "你好"
        ob = self.observe(\KVOTestClass.name, options: [.new, .old]) { (_, change) in
            print(change)
        }
        print("KVOTestClass init")
    }
    deinit {
        print("KVOTestClass dealloc")
    }
}

var kvoTestObj: KVOTestClass? = KVOTestClass()
kvoTestObj?.name = "码农晨仔"
kvoTestObj = nil

总结:
1.必须显示继承NSObject
2.必须使用@objc dynamic修饰,否则无效。
3.demo地址
4.CSDN

上一篇下一篇

猜你喜欢

热点阅读