http://reactivex.io/documentation/operators.html
一、轉(zhuǎn)換操作符
map
將源 Observable 的每個(gè)元素應(yīng)用你提供的轉(zhuǎn)換方法,然后返回含有轉(zhuǎn)換結(jié)果的 Observable。

flatMap
將源 Observable 的每個(gè)元素轉(zhuǎn)換成其他的 Observable,然后將這些 Observables 合并。

flatMapLatest
將源 Observable 的每個(gè)元素轉(zhuǎn)換成其他的 Observable,然后取這些 Observables 中最新的一個(gè)。
flatMapLatest 一旦轉(zhuǎn)換出一個(gè)新的 Observable,就只發(fā)出它的元素,舊的 Observables 的元素將被忽略掉。
常用于網(wǎng)絡(luò)請(qǐng)求,后面的請(qǐng)求將會(huì)代替前面的請(qǐng)求。

flatMapFirst
與 flatMapLatest 相反,flatMapFisrt 會(huì)選擇舊的值,拋棄新的。
二、組合操作符
combineLatest
當(dāng)兩個(gè)序列中的任何一個(gè)發(fā)射了數(shù)據(jù)時(shí),combineLatest 會(huì)結(jié)合并整理每個(gè)序列發(fā)射的最近數(shù)據(jù)項(xiàng)。

zip
zip 和 combineLatest 相似,不同的是每當(dāng)所有序列都發(fā)射一個(gè)值時(shí), zip 才會(huì)發(fā)送一個(gè)值。它會(huì)等待每一個(gè)序列發(fā)射值,發(fā)射次數(shù)由最短序列決定。結(jié)合的值都是一一對(duì)應(yīng)的。

merge
merge 會(huì)將多個(gè)序列合并成一個(gè)序列,序列發(fā)射的值按先后順序合并。

concat
concat 操作符將多個(gè) Observables 按順序串聯(lián)起來(lái),當(dāng)前一個(gè) Observable 元素發(fā)送完畢后,后一個(gè) Observable 才可以開(kāi)始發(fā)出元素。

三、其他
materialize
通常,一個(gè)有限的 Observable 將產(chǎn)生零個(gè)或者多個(gè) onNext 事件,然后產(chǎn)生一個(gè) onCompleted 或者 onError 事件。
materialize 操作符將 Observable 產(chǎn)生的這些事件全部轉(zhuǎn)換成元素,然后發(fā)送出來(lái)。
shareReplay
所有觀察者共享源Observable,并且緩存最新的n個(gè)元素,將這些元素直接發(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)
輸出結(jié)果:
map
next(1)
map
next(1)
如果打開(kāi)注釋.share(replay: 1),則輸出如下:
map
next(1)
next(1)
可以看到shareReplay避免了map的多次調(diào)用,減少了不必要的開(kāi)支。
對(duì)于Driver序列,所有觀察者默認(rèn)是共享源,因此不需要再指定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)
輸出結(jié)果:
map
1
1
withLatestFrom
withLatestFrom 操作符將兩個(gè) Observables 中最新的元素通過(guò)一個(gè)函數(shù)組合起來(lái),然后將這個(gè)組合的結(jié)果發(fā)出來(lái)。當(dāng)?shù)谝粋€(gè) Observable 發(fā)出一個(gè)元素時(shí),就立即取出第二個(gè) Observable 中最新的元素,通過(guò)一個(gè)組合函數(shù)將兩個(gè)最新的元素合并后發(fā)送出去。

retry/retryWhen
如果源 Observable 產(chǎn)生一個(gè)錯(cuò)誤事件,重新對(duì)它進(jìn)行訂閱,希望它不會(huì)再次產(chǎn)生錯(cuò)誤。

throttle
僅在過(guò)了一段指定的時(shí)間還沒(méi)發(fā)射數(shù)據(jù)時(shí)才發(fā)射一個(gè)數(shù)據(jù),換句話說(shuō)就是 throttle 會(huì)抑制發(fā)射過(guò)快的值,常用于監(jiān)聽(tīng)textFiled輸入變化并發(fā)送網(wǎng)絡(luò)請(qǐng)求。

冷、熱信號(hào)
ReactiveCocoa 針對(duì)熱、冷信號(hào)分別提供了這兩種類型:Signal與SignalProducer。而 RxSwift提供了一種同時(shí)支持冷、熱信號(hào)的類型:Observable<T>。雖然RxSwift并沒(méi)有明顯區(qū)分兩種類型,但是明確冷熱信號(hào)的含義是非常必要的,因?yàn)楹雎运赡軙?huì)造成代碼邏輯的錯(cuò)誤。
冷信號(hào):
冷信號(hào)是被動(dòng)的,只有當(dāng)你訂閱的時(shí)候,它才會(huì)發(fā)布消息。
常見(jiàn)的網(wǎng)絡(luò)請(qǐng)求,異步操作,都是冷信號(hào)。
熱信號(hào):
熱信號(hào)是主動(dòng)的,盡管你并沒(méi)有訂閱事件,但是它會(huì)時(shí)刻推送。
常見(jiàn)的值變化,點(diǎn)擊,UIControlEvent,時(shí)間變化都是熱信號(hào)。