在Combine 中,Publisher 是觀察者模式中的Observable,並且可以通過組合變換(利用Operator)重新生成新的Publisher
主要功能是提供數據,不論是被動請求或是主動提供,有兩個 Output
和 Failure
關聯類型屬性,Output
代表數據流中輸出的值,值的更新可能是同步,也可能是異步,Failure
代表可能產生的錯誤,也就是說Pubslier 最核心的是定義了要發布的值與可能的錯誤。Publisher 通過receive(subscriber:)
接口來接受訂閱,而Subscriber 訂閱者的 Input
和 Failure
關聯類型屬性必須與 Publisher 聲明的 Output
和 Failure
類型相匹配來保證類型安全
以下舉一些常見的Publisher 例子:
Just
struct Just<Output>
會給每個訂閱者發送一個消息,然後立即結束(這個數據流只包含一個值)
let justPubliser = Just("Hello")
Future
typealias Future<Output, Failure>.Promise = (Result<Output, Failure>) -> Void
Future
是一個專門處理異步函數的Publisher,Future
初始化需要提供執行具體操作的closure,這個操作可以是異步的,並且最終返回一個Result
,所以Future
只有兩種結果:
在將一些異步操作轉換為Publisher 時非常有用,像是網絡請求等等
let futurePubliser = Future<Int, Never> { promise in
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
promise(.success(1))
}
}
Deferred
Deferred
初始化需要提供一個生成Publisher 的closure,只有在有Subscriber 訂閱的時候才會生成指定的Publisher,也就是當收到訂閱後才建立Publisher
let deferredPublisher = Deferred {
return Future<Bool, Error> { promise in
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
return promise(.success(true))
}
}
}
Future
不管有沒有訂閱者都會立刻執行,而Deferred
只有當收到訂閱後才會初始化