http://reactivex.io/documentation/operators.html
一、轉換操作符
map
將源 Observable 的每個元素應用你提供的轉換方法衬吆,然后返回含有轉換結果的 Observable。
flatMap
將源 Observable 的每個元素轉換成其他的 Observable式曲,然后將這些 Observables 合并。
flatMapLatest
將源 Observable 的每個元素轉換成其他的 Observable缸榛,然后取這些 Observables 中最新的一個吝羞。
flatMapLatest 一旦轉換出一個新的 Observable,就只發(fā)出它的元素内颗,舊的 Observables 的元素將被忽略掉钧排。
常用于網(wǎng)絡請求,后面的請求將會代替前面的請求均澳。
flatMapFirst
與 flatMapLatest 相反恨溜,flatMapFisrt 會選擇舊的值符衔,拋棄新的。
二糟袁、組合操作符
combineLatest
當兩個序列中的任何一個發(fā)射了數(shù)據(jù)時判族,combineLatest 會結合并整理每個序列發(fā)射的最近數(shù)據(jù)項。
zip
zip 和 combineLatest 相似项戴,不同的是每當所有序列都發(fā)射一個值時形帮, zip 才會發(fā)送一個值。它會等待每一個序列發(fā)射值周叮,發(fā)射次數(shù)由最短序列決定辩撑。結合的值都是一一對應的。
merge
merge 會將多個序列合并成一個序列仿耽,序列發(fā)射的值按先后順序合并合冀。
concat
concat 操作符將多個 Observables 按順序串聯(lián)起來,當前一個 Observable 元素發(fā)送完畢后项贺,后一個 Observable 才可以開始發(fā)出元素君躺。
三、其他
materialize
通常开缎,一個有限的 Observable 將產(chǎn)生零個或者多個 onNext 事件晰洒,然后產(chǎn)生一個 onCompleted 或者 onError 事件。
materialize 操作符將 Observable 產(chǎn)生的這些事件全部轉換成元素啥箭,然后發(fā)送出來。
shareReplay
所有觀察者共享源Observable治宣,并且緩存最新的n個元素急侥,將這些元素直接發(fā)送給新的觀察者。
let sequence: PublishRelay<Int> = PublishRelay<Int>.init()
let observable = sequence.map { i -> Int in
print("map")
return i
}
observable.subscribe{print($0)}.disposed(by: rx.disposeBag)
observable.subscribe{print($0)}.disposed(by: rx.disposeBag)
sequence.accept(1)
輸出結果:
map
next(1)
map
next(1)
如果打開注釋.share(replay: 1)
,則輸出如下:
map
next(1)
next(1)
可以看到shareReplay避免了map的多次調用侮邀,減少了不必要的開支坏怪。
對于Driver序列,所有觀察者默認是共享源绊茧,因此不需要再指定shareReplay铝宵。
let sequence: PublishRelay<Int> = PublishRelay<Int>.init()
let observable = sequence.map { i -> Int in
print("map")
return i
}.asDriver(onErrorDriveWith: Driver.empty())
observable.drive{print($0)}.disposed(by: rx.disposeBag)
observable.drive{print($0)}.disposed(by: rx.disposeBag)
sequence.accept(1)
輸出結果:
map
1
1
withLatestFrom
withLatestFrom 操作符將兩個 Observables 中最新的元素通過一個函數(shù)組合起來,然后將這個組合的結果發(fā)出來华畏。當?shù)谝粋€ Observable 發(fā)出一個元素時鹏秋,就立即取出第二個 Observable 中最新的元素,通過一個組合函數(shù)將兩個最新的元素合并后發(fā)送出去亡笑。
retry/retryWhen
如果源 Observable 產(chǎn)生一個錯誤事件侣夷,重新對它進行訂閱,希望它不會再次產(chǎn)生錯誤仑乌。
throttle
僅在過了一段指定的時間還沒發(fā)射數(shù)據(jù)時才發(fā)射一個數(shù)據(jù)百拓,換句話說就是 throttle 會抑制發(fā)射過快的值琴锭,常用于監(jiān)聽textFiled輸入變化并發(fā)送網(wǎng)絡請求。
冷衙传、熱信號
ReactiveCocoa 針對熱决帖、冷信號分別提供了這兩種類型:Signal與SignalProducer。而 RxSwift提供了一種同時支持冷蓖捶、熱信號的類型:Observable<T>地回。雖然RxSwift并沒有明顯區(qū)分兩種類型,但是明確冷熱信號的含義是非常必要的腺阳,因為忽略它可能會造成代碼邏輯的錯誤落君。
冷信號:
冷信號是被動的,只有當你訂閱的時候亭引,它才會發(fā)布消息绎速。
常見的網(wǎng)絡請求,異步操作焙蚓,都是冷信號纹冤。
熱信號:
熱信號是主動的,盡管你并沒有訂閱事件购公,但是它會時刻推送萌京。
常見的值變化,點擊宏浩,UIControlEvent知残,時間變化都是熱信號。