【问题标题】:KVO publisher does not send signal on property changeKVO 发布者不发送关于属性更改的信号
【发布时间】:2022-06-29 20:33:47
【问题描述】:

我刚开始学习 Combine,对 KVO 发布者的行为感到很困惑。他们只是不发布任何事件,除了初始值。 这是我使用的示例代码:

@objc class SampleClass: NSObject {
    @objc var name: NSString = "1"
}

var a = SampleClass()

let kvoPublisher = a.publisher(for: \.name)
    .sink(receiveCompletion: {
        print("completion \($0)")
    }, receiveValue: { newVal in
        print("new val - \(newVal)")
    })

a.name = "2"
a.name = "3"

print("Finished; publisher = \(kvoPublisher) | a.name = \(a.name)")

控制台输出是

new val - 1
Finished; publisher = Combine.AnyCancellable | a.name = 3

您能否解释一下我在这里缺少什么以及如何解决它?

谢谢。

【问题讨论】:

    标签: swift reactive-programming combine key-value-observing


    【解决方案1】:

    您还需要将该属性标记为 dynamic 以使其符合 KVO。 publisher(for:) 仅适用于符合 KVO 的属性,因为它在底层使用了 KVO。

    @objc class SampleClass: NSObject {
        @objc dynamic var name: NSString = "1"
    }
    

    一旦您这样做了,KVO 发布者就会按预期发出更新的值。

    有关@objc@objc dynamic 的更多信息,请参阅this Q&A

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-30
      • 1970-01-01
      • 1970-01-01
      • 2012-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多