Combine-Publisher
概念
- Combine 中包括
Publisher
在內的一系列角色都使用協議來進行定義,這是 Swift 面向協議編程思想的具體體現。
- Publisher 隨著時間推移向一個或多個
Subscriber
發布數據。
- Publisher 最主要的工作其實有兩個
Publisher定義
public protocol Publisher { /// 發送的數據的類型 associatedtype Output /// Publisher可能產生的錯誤類型,如果不會產生錯誤,則使用Never associatedtype Failure: Error /// 在調用Publisher的subscribe(_:)方法時方法內部會調用此方法去連接Subscriber func receive<S>(subscriber: S) where S: Subscriber, Self.Failure == S.Failure, Self.Output == S.Input } extension Publisher { /// 將指定的Subscriber連接到此Publisher /// 調用此方法連接而不是receive(subscriber:) public func subscribe<S>(_ subscriber: S) where S: Subscriber, Self.Failure == S.Failure, Self.Output == S.Input }
解讀
-
Output
及Failure
定義了 Publisher 所發布的數據的類型和可能產生的錯誤類型。
-
subscribe (_:)
方法將 Subscriber 連接到 Publisher。 它規定: Publisher 的Output
必須與 Subscriber 的Input
類型匹配,Failure
也是如此。
內置Publisher
-
Just
:只提供一個結果然後終止的 Publisher ,失敗類型為<Never>
。(★)
-
Future
:非同步操作的 Publisher ,用一個閉包初始化,該閉包最終解析為單個輸出數據或失敗完成。(★)
-
Empty
: 一個從不發布任何數據的 Publisher ,並且可以選擇立即完成。
-
Fail
:立即使用指定錯誤終止的 Publisher 。
-
Optional
:如果可選數據具有數據,則 Publisher 僅向每個 Subscriber 發布一次可選數據。
-
Sequence
:發布給定數據序列的 Publisher 。
-
Deferred
:在運行提供的閉包之前等待訂閱的 Publisher ,以便為新的 Subscriber 創建 Publisher 。
-
Record
:允許記錄一系列Input
和Completion
,供每個 Subscriber 回放。
-
Publishers.Share
:實現者為類的 Publisher ,其行為與其上游 Publisher 相同。
-
Publishers.Multicast
:多播 Publisher ,當有多個 Subscriber,但希望上游 Publisher 的每個數據僅調用一次receive(_ :)
時使用。
-
ObservableObject
:與 SwiftUI 一起使用,符合ObservableObject
協議的對象可以提供 Publisher 。(★)
-
@Published
:屬性包裝器,用來把一個屬性數據轉變為 Publisher 。(★)