Combine-Publisher

概念

  • Combine 中包括Publisher在內的一系列角色都使用協議來進行定義,這是 Swift 面向協議編程思想的具體體現。
  • Publisher 隨著時間推移向一個或多個Subscriber發布數據。
  • Publisher 最主要的工作其實有兩個
    • 被 Subscriber 訂閱
    • 發布數據和數據

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  }

解讀

  • OutputFailure定義了 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:允許記錄一系列InputCompletion,供每個 Subscriber 回放。
  • Publishers.Share:實現者為類的 Publisher ,其行為與其上游 Publisher 相同。
  • Publishers.Multicast:多播 Publisher ,當有多個 Subscriber,但希望上游 Publisher 的每個數據僅調用一次receive(_ :)時使用。
  • ObservableObject:與 SwiftUI 一起使用,符合ObservableObject協議的對象可以提供 Publisher 。(★)
  • @Published:屬性包裝器,用來把一個屬性數據轉變為 Publisher 。(★)