Combine 入門-Operator

Zhi-Hong Lin
4 min readOct 26, 2021

--

上下連接 Publisher 和 Subscriber,對 Publisher 輸出的數據進行處理。此篇會介紹較為常用的 Operator

  1. Transforming Operators(map、scan)
  2. Filtering Operators(filter、removeDuplicates、compactMap)
  3. Combining Operators(combineLatest、zip、merge)
  4. Time Manipulation Operators(debounce、throttle、delay、timeout)
  5. Encoding and Decoding Operators(encode、decode)

Transforming Operators

map

能夠將數據轉換成我們所需要的類型。

scan

具有記憶功能,只能記憶一個單位的數據,因此能夠把上次計算後的結果保存起來,在下次計算的時候獲取到這個值。

Filtering Operators

filter

只有結果為 true 的數據才會被保存下來,以下範例為篩選數字大於 8 的結果。

removeDuplicates

過濾重複的數據,默認情況下,當我們使用.removeDuplicates()的時候,Publisher 輸出的數據必須要遵循 Equatable 協議。

如果 Publisher 輸出的數據不遵循 Equatable 協議,也可以在 closure 裡過濾重複的 age 或 score。

compactMap

用於處理 optional 的數據,過濾 nil。

Combining Operators

combineLatest

  • 行為:當任意一個 publisher 發送值時,combineLatest 會將每個 publisher 的最新值組合在一起,並發送這個組合結果。
  • 觸發條件:任意一個 publisher 發送值。
  • 輸出:每個 publisher 的最新值組合。

zip

  • 行為:當所有的 publisher 都發送值時,zip 會將這些值組合在一起,並發送這個組合結果。
  • 觸發條件:所有的 publisher 都發送值。
  • 輸出:所有 publisher 的值組合成的 tuple。

merge

  • 行為:當任意一個 publisher 發送值時,merge 會立即轉發這個值。
  • 觸發條件:任意一個 publisher 發送值。
  • 輸出:單個 publisher 的值。

Time Manipulation Operators

debounce

等待並輸出時間間隔以內的最後一次數據。

使用場景:

  • 處理每當用戶在搜尋匡輸入文字的時候,頻繁發起網絡請求的問題。透過debounce,可以實現,當用戶停止輸入 0.5 秒再發送請求。

throttle

輸出時間間隔內的第一次或者最後一次數據。

使用場景:

  • 處理按鈕的連續點擊問題。透過throttle只接收 0.5 秒內的第一次或者最後一次點擊事件。

注:latest 如果為 true 在時間間隔內只有最後一個事件會被處理。

如果為 false 在時間間隔內第一個事件會被處理,而後續的事件會被忽略。

debouncethrottle的差別在於,假設用戶在 2 秒內連續點擊按鈕,時間間隔為 0.5 秒,那麼throttle可以發送4次數據,而debounce不會發送數據,只有當用戶停止點擊 0.5 秒後,才會發送一次數據。

delay

能夠讓 pipline 在收到 Publisher 發送的數據後,等待一定的時間,然後再發送數據。

使用場景:

  • 當 Timer.publisher 調用了 .autoconnect() 後,就會立刻收到數據,如果我們想延遲幾秒執行的話,可以使用delay

timeout

用於設置 pipline 的超時時間,通常以秒為單位。

Encoding and Decoding Operators

encode

將 Object 編碼成 Json 數據。

decode

將 Json 數據解碼成 Object。

Sign up to discover human stories that deepen your understanding of the world.

--

--

No responses yet

Write a response