美文网首页
swift中KVO的使用

swift中KVO的使用

作者: 90后的晨仔 | 来源:发表于2021-02-07 14:05 被阅读0次

    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

    相关文章

      网友评论

          本文标题:swift中KVO的使用

          本文链接:https://www.haomeiwen.com/subject/pgjztltx.html