通知对象(观察者oberver
)其他对象(被观察者observed
)属性的更改
概述:Key-Value Observing是一种Cocoa
编程模式,用于通知对象关于其他对象属性的更改。它对于在应用程序的逻辑分离部分之间(例如model
和view
之间)传递更改非常有用。只能对继承自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
实例的oldValue
和newValue
属性来查看正在观察的属性发生了什么变化。
如果不需要知道属性是如何更改的,请忽略options
参数。省略options
参数将放弃存储新和旧属性值,这将导致oldValue
和newValue
属性为nil
。
3.将观察者和观察的属性进行关联,通过将对象传递给观察者的初始化器,你可以将你想要观察的属性与其观察者关联起来:
let observed = MyObjectToObserve()//被观察者
let observer = MyObserver(object: observed)//观察者
4.响应属性更改。被设置为使用KVO
的对象(如上面的observe
)通知其观察者属性更改。下面的示例通过调用updateDate
方法更改myDate
属性。这个方法调用会自动触发观察者的变更处理程序:
observed.updateDate()
网友评论