【问题标题】:Can the Swift adaptation of KVO handle custom targets?KVO 的 Swift 适配可以处理自定义目标吗?
【发布时间】:2020-04-01 00:04:15
【问题描述】:

要在 Swift 中进行 KVO,您需要创建一个基于 NSObject@objc 类,并且可以观察存储并标记为 @objcdynamic 的属性。

  • 您能否观察计算属性(即@objcdynamic)?

我刚刚浏览了 Objective-C 指南,它表明您可以为计算属性标记 KVO 依赖项。并且(我认为)观察元素级别的数组属性变化。这些都可以在 Swift 中完成吗?

【问题讨论】:

  • 如果一个属性是一个计算属性,你到底会观察什么?什么会构成计算属性的变化?我的意思是,我知道我们使用存储属性观察到的内容:调用了 setter,从而以符合 KVC 的方式更改了属性的值。计算属性的类比是什么?
  • "这些都可以在 Swift 中完成吗?"你试过了吗?请举例说明你想观察什么。

标签: swift key-value-observing


【解决方案1】:

你问:

你能观察计算的属性(@objcdynamic)吗?

是的。只需标记您的计算属性@objcdynamic,当调用计算属性的设置器时,将调用观察者。


例如,考虑一个同步器类,您希望在其中观察计算属性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 通知。

【讨论】:

    猜你喜欢
    • 2011-10-27
    • 2014-07-27
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多