Swift中的KVO

2020-09-19  本文已影响0人  ChiralKing
通知对象(观察者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()
上一篇 下一篇

猜你喜欢

热点阅读