簡體   English   中英

防止立即調用接收器接收值關閉

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

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