Rx中的那些操作符

一銘發表於2017-12-13

[TOC]

記錄學習 Rx 過程中的各種操作符以ß及用法還有 tips 等等. 所有彈珠圖均來自 RxMarbles App.

Filtering Opertators

  • ignoreElements: 忽略. next 事件.會接受到結束事件(.completed, .error).

    ignoreElements.png

  • filter: filter 接受一個作用於每個事件的predicate closure,當 predicate 結果為 true時通過.

    filter.png

Skipping Opertators

  • skip: skip 操作符允許忽略從第一個到輸入的number個事件.

    skip.png

  • skipWhile 與 skipUntil: 這兩個都是帶條件的 skip 操作符,skipWhile 接受一個斷言來判斷 Skip 哪一個;

    skipWhile.png
    而 skipUntil不是接受一個靜態條件,而且是接受另一個 observable, 它會 skip source Observable 的事件直到收到 trigger Observable 的事件.
    skipUntil.png

Taking Opertators

taking 是 skip 的對立面,這樣就很好理解了. 直接放彈珠圖.

take.png

takeWhile.png

takeUntil.png

Transforming Opertators

  • map: 跟 Swift的map 類似,接受一個閉包然後對每個事件做處理.

    map.png

  • flatMap: 最開始理解 Swift 的 map和 flatMap 就比較費勁,後來知道 flatMap 的核心就就是: 降維 先看看 flatMap的定義

public func flatMap<O: ObservableConvertibleType>(selector: (E) throws -> O) -> Observable<O.E> {
    return FlatMap(source: asObservable(), selector: selector)
}
複製程式碼

在 Rx 中,flatMap可以把一個序列轉換成一組序列,然後再把這一組序列拍扁成一個序列。拍扁 其實就是降維的意思.

flatMap.png

Combining Opertators

  • CombineLatest: combineLatest 操作符用閉包接受每個佇列最新的值,然後最新的值合併成一個新值傳送出去.

CombineLatest.png

  • Concat: concat 操作符可以把多個佇列合併起來,合併是順序是按照佇列新增的順序

Concat.png

  • Merge: merge操作符也是把對個佇列合併,但與 concat 不同的是它是按照佇列發出事件的時間來合併.

Merge.png

  • StartWith: startWith 操作符給一個佇列給定了一個初始值,這個值的型別必須和佇列裡面的元素型別相同.

StartWith.png

share 與 shareReplay

如果有多個 observable需要共享同一個事件,就需要用到 share. 有一個情形,如果一個請求需要多次訂閱,但又不想多次請求,那麼就需要多個訂閱者共享一個訂閱者物件. share: 如果訂閱者降到0,會重置佇列重新開始傳送 shareReplay(_): 這裡要傳一個 bufferSize, 在share的基礎上,佇列會從最新的值開始重播bufferSize個值。 詳細連結

to be continued

相關文章