[英]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.