原创作者:Apple
原文链接: Swift 中使用键-值观察
翻译:Zack
通知对象(Objects)关于其它对象(Objects)属性的改变。
预览
键-值观察是一种 Cocoa 编程模式,使用它通知对象关于另一些对象的属性发生改变。它非常有用在 app 的逻辑分离部分之间交流改变--例如在模型和视图之间。在那些继承自 NSObject 的类中,你能使用键-值观察。
为键-值观察标注一个属性
键-值观察设计模式使用 @objc 属性和 dynamic 修饰符去标注那些你想观察的属性。例如以下在MyObjectToObserve 类中的被观察的属性-myDate。
class MyObjectToObserve: NSObject {
@objc dynamic var myDate = NSDate(timeIntervalSince1970: 0) // 1970
func updateDate() {
myDate = myDate.addingTimeInterval(Double(2 << 30)) // Adds about 68 years.
}
}
定义一个观察者
观察者类的实例管理一个或者多个属性发生改变的信息。当你创建一个观察者,你通过调用 observe(_:options:changeHandler:) 方法开始观察并且传递一个指向被观察属性的关键路径作为参数。
在以下例子中,.objectToObserve.myDate 关键路径指向 MyObjectToObserve 的 ** myDate **属性:
class MyObserver: NSObject {
@objc var objectToObserve: MyObjectToObserve
var observation: NSKeyValueObservation?
init(object: MyObjectToObserve) {
objectToObserve = object
super.init()
observation = observe(
\.objectToObserve.myDate,
options: [.old, .new]
) { object, change in
print("myDate changed from: \(change.oldValue!), updated to: \(change.newValue!)")
}
}
}
你使用 NSKeyValueObservedChange 实例的 newValue 和 oldValue 属性去查看你正在观察属性的改变。
如果你不想知道属性如何改变,忽略 options 参数。被忽略的 options 放弃存储 new 和 old 属性值,这样导致 oldValue 和 oldValue 值为 nil。
关联观察者和被观察的属性
通过传递对象到观察者的初始化方法中去关联你想观察的属性和观察者:
let observed = MyObjectToObserve()
let observer = MyObserver(object: observed)
响应一个属性的改变
那些设置键-值观察的对象--例如以上被观察的对象--通知他们的观察者通过属性改变。例如以下例子 myDate 属性改变通过调用 updateDate 方法。这个方法调用自动触发观察者的改变句柄:
observed.updateDate() // Triggers the observer's change handler.
// Prints "myDate changed from: 1970-01-01 00:00:00 +0000, updated to: 2038-01-19 03:14:08 +0000"
以上例子响应属性的改变通过打印日期的新值和旧值。
网友评论