要在Swift中进行KVO,您需要创建一个基于NSObject
的@objc
类,并且可以观察存储并标记为@objc
和dynamic
的属性。
@objc
和dynamic
)?我只是看了一下Objective-C指南,它表明您可以标记计算属性的KVO依赖关系。并且(我认为)观察数组属性在元素级别上的变化。这些都可以在Swift中完成吗?
您问:
您是否可以观察计算属性(
@objc
和dynamic
)?
是。只需标记您的计算属性@objc
和dynamic
,并在调用计算属性的设置器时,将调用观察者。
例如,考虑要在其中观察计算属性value
的同步器类:
class Synchronized: NSObject {
private var _value: Int
private let queue = DispatchQueue(label: "synchronizer", attributes: .concurrent)
init(value: Int) {
_value = value
super.init()
}
@objc dynamic var value: Int {
get { queue.sync { _value } }
set { queue.async(flags: .barrier) { self._value = newValue} }
}
}
[这里,value
是一个计算变量,您可以set
,所有常规的KVO都可以发生:
token = foo.observe(\.value, options: .new) { _, change in
print(change.newValue ?? "Unknown")
}
value
设置器被调用时触发此观察器。
唯一的诀窍是,如果计算属性返回的值通过计算属性的setter以外的其他方式更改,那么您是否希望KVO触发通知。在这种情况下,您必须手动发布KVO通知。