我剛剛開始學習 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
您能否解釋一下我在這里缺少什么以及如何解決?
謝謝。
uj5u.com熱心網友回復:
您還需要將屬性標記為dynamic以使其符合 KVO。publisher(for:)僅適用于符合 KVO 的屬性,因為它在底層使用了 KVO。
@objc class SampleClass: NSObject {
@objc dynamic var name: NSString = "1"
}
一旦你這樣做了,KVO 發布者就會按預期發出更新的值。
有關@objcvs的更多資訊@objc dynamic,請參閱此問答。
請記住,您應該只在與無法更改的代碼互動時使用 KVO 發布者。當您想觀察您控制的型別的屬性值時,請@Published改用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/497656.html
上一篇:反轉線性漸變圖例中的顏色方向
下一篇:帶有內部運算式條件的正則運算式
