swift中KVO的使用

本文介绍了在Swift中使用Key-Value Observing (KVO) 的方法,强调了必须继承自NSObject并使用@objc dynamic关键字的重要性。提供两种实现方式,包括手动添加观察者和使用KVOTestClass的简便方法。总结了使用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.简书

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值