iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 4
0
自我挑戰組

30 天了解 Swift 的 Combine系列 第 4

30 天了解 Swift 的 Combine: [04] Combine初探, Publisher與 Subscriber

  • 分享至 

  • xImage
  •  

Combine 提供了宣告形式的 Swift API,主要處理隨時間處理值變化(各種異步行程產出的事件)。發布者(publisher) 產出可隨時間變化的值,訂閱者(subscriber) 從發布者接收這些值。

Publisher 的角色是提供數據, 不論是被動請求或是主動提供. 其中有兩個 container 泛型, Output 與 Failure. subscriber 同時也有泛型, Input 與 Failure. Publishers 和 subscribers 必須互相連接才能運作. 而當連接一個 subscriber 到 任何 publisher 時, 所有相對應的資料型別都必須相同: Output 與 Input 對應, Failure 對應 Failure.

Publisher source       Subscriber
+--------------+      +--------------+
|        <Output> --> <Input>        |
|       <Failure> --> <Failure>      |
+--------------+      +--------------+

而 operator 則是 publisher 之間的轉換器(adoptor), 可以訂閱一個 publisher, 也可以讓任何 subscriber 要求數據.
甚至可以產出 publisher 鏈(chain).

Publisher source              Operator             Subscriber
+------------------------+ +------------+ +------------------------+
|    <Output> --> <Input>       map        <Output> --> <Input>    |
|   <Failure> --> <Failure>   function    <Failure> --> <Failure>  |
+------------------------+ +------------+ +------------------------+

這些組合完成的序列結構, 稱為 pipelines(管路).

Operators 可以轉換 publisher 與 subscriber 之間的數據, 分流或集合流.

import Combine

let publisher = Just(5)
let publisherString = publisher.map{$0.description}
let publisherDouble = publisher.map{Double($0)}

let subcriber = publisher.sink(receiveValue: {print($0)})        // 5
let anotherScriber = publisherDouble.sink(receiveValue: {print("Another",$0)})         //Another 5.0

當面對一個 pipelines 時, 可以將他看成一串 operations 彼此串接型別的序列.

Combine 中的 operators 具備相對應的轉換功能來達成特殊的轉換. 例如 map 是單純轉換 Input, 而 tryMap 是同時間傳換 Input 與 Failure, 像是 Never 轉換成 Decode Error.

上面的例子將 Publisher <Int, Never>, 分別轉換成 Publisher<String,Never>Publisher<Double,Never>

參考來源: Using Combine: https://heckj.github.io/swiftui-notes/#core-publisher-subscriber

簡單測驗:

  1. 嘗試在蘋果官方文件找到以 Publisher 形式實作timer的文件
  2. 嘗試在蘋果官方文件找到以 Operator 形式實作delay的文件

whoami:
我是游諭, ytyubox


上一篇
30 天了解 Swift 的 Combine: [03] 其實你早就在用響應式的概念
下一篇
30 天了解 Swift 的 Combine: [05] Publisher與 Subscriber 的 Lifecycle + 彈珠圖
系列文
30 天了解 Swift 的 Combine30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言