KVO的Swift改编可以处理自定义目标吗?

问题描述 投票:0回答:1

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

  • 您是否可以观察计算属性(@objcdynamic)?

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

swift key-value-observing
1个回答
0
投票

您问:

您是否可以观察计算属性(@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通知。

© www.soinside.com 2019 - 2024. All rights reserved.