[英]Prevent sink receiveValue closure from being called immediately
考慮以下代碼(您可以直接將其 c&p 到操場中):
class Foo: ObservableObject {
@Published var bar = "bar"
}
let foo = Foo()
let someSubscriber = foo.$bar
.sink { value in
print("value is \(value)")
}
盡管 Foo 剛剛初始化一次並且它的成員bar
從未改變,但接收器立即執行它的receiveValue
閉包。 有什么辦法可以防止這個初始調用發生,例如,有沒有我可能忽略的操作員?
您可以使用dropFirst
運算符。 沒有參數,它只丟棄來自上游的第一個輸出。
let someSubscriber = foo.$bar
.dropFirst()
.sink { value in
print("value is \(value)")
}
要解決評論中提出的問題:
Publisher
每個實現都可以決定如何處理每個新訂閱者。 這是一個政策決定,通常不是設計缺陷。 不同的Publisher
做出不同的決定。 這里有些例子:
PassthroughSubject
不會立即發布任何內容。CurrentValueSubject
立即發布其當前值。.initial
選項創建時, NSObject.KeyValueObservingPublisher
立即發布觀察屬性的當前值。Published.Publisher
(這是您為@Published
屬性獲得的類型)立即發布該屬性的當前值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.