Вы спросили:
Можете ли вы наблюдать за вычисленными свойствами (которые @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
, и все обычные КВО могут иметь место:
token = foo.observe(\.value, options: .new) { _, change in
print(change.newValue ?? "Unknown")
}
Этот наблюдатель срабатывает, когда вызывается установщик value
.
Единственный трюк будет, если вы хотите, чтобы сработало уведомление KVO, если значение, возвращаемое вычисленным свойством, изменяется с помощью чего-то другого, кроме установщика вычисляемого свойства. В этом случае вам придется вручную выдавать уведомления KVO.