美文网首页
Swift中的KVO

Swift中的KVO

作者: ChiralKing | 来源:发表于2020-09-19 18:29 被阅读0次
    通知对象(观察者oberver)其他对象(被观察者observed)属性的更改

    概述Key-Value Observing是一种Cocoa编程模式,用于通知对象关于其他对象属性的更改。它对于在应用程序的逻辑分离部分之间(例如modelview之间)传递更改非常有用。只能对继承自NSObject的类使用键值观察。

    1.为你想要通过KVO观察的属性标记为@objc属性和dynamic动态修饰符。

    class MyObjectToObserve: NSObject {
        @objc dynamic var myDate = NSDate(timeIntervalSince1970: 0)
        func updateDate() {
            myDate = myDate.addingTimeInterval(Double(2<<30))
        }
    }
    

    2.定义一个观察者observer,一个observer类的实例会管理一个或多个属性所做更改的信息,当您创建一个观察者时,您通过调用observe(_:options:changeHandler:)方法开始观察,该方法带有一个引用您想要观察的属性的keyPath

    class MyObserver: NSObject {
        @objc var objectToObserver: MyObjectToObserve
        var observation: NSKeyValueObservation?
        
        init(object: MyObjectToObserve) {
            objectToObserver = object
            super.init()
            observation = observe(\.objectToObserver.myDate, options: [.old, .new], changeHandler: { (object, change) in
                print("myDate changed from: \(change.oldValue!), updated to: \(change.newValue!)")
            })
        }
    }
    

    使用NSKeyValueObservedChange实例的oldValuenewValue属性来查看正在观察的属性发生了什么变化。
    如果不需要知道属性是如何更改的,请忽略options参数。省略options参数将放弃存储新和旧属性值,这将导致oldValuenewValue属性为nil
    3.将观察者和观察的属性进行关联,通过将对象传递给观察者的初始化器,你可以将你想要观察的属性与其观察者关联起来:

    let observed = MyObjectToObserve()//被观察者
    let observer = MyObserver(object: observed)//观察者
    

    4.响应属性更改。被设置为使用KVO的对象(如上面的observe)通知其观察者属性更改。下面的示例通过调用updateDate方法更改myDate属性。这个方法调用会自动触发观察者的变更处理程序:

    observed.updateDate()
    

    相关文章

      网友评论

          本文标题:Swift中的KVO

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