簡體   English   中英

KVO 發布者不發送關於屬性更改的信號

[英]KVO publisher does not send signal on property change

我剛剛開始學習 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

您能否解釋一下我在這里缺少什么以及如何解決?

謝謝。

您還需要將屬性標記為dynamic ,以使其符合 KVO。 publisher(for:)僅適用於符合 KVO 的屬性,因為它在底層使用了 KVO。

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

一旦你這樣做了,KVO 發布者就會按預期發出更新的值。

有關@objc@objc dynamic的更多信息,請參閱此問答

請記住,您應該只在與無法更改的代碼交互時使用 KVO 發布者。 當您想觀察您控制的類型的屬性值時,請改用@Published

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM