Combine 入門-Operator
上下連接 Publisher 和 Subscriber,對 Publisher 輸出的數據進行處理。此篇會介紹較為常用的 Operator
- Transforming Operators(map、scan)
- Filtering Operators(filter、removeDuplicates、compactMap)
- Combining Operators(combineLatest、zip、merge)
- Time Manipulation Operators(debounce、throttle、delay、timeout)
- 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 在時間間隔內第一個事件會被處理,而後續的事件會被忽略。
debounce
跟throttle
的差別在於,假設用戶在 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。