創(chuàng)建操作
用于創(chuàng)建Observable的操作符
Create
通過調(diào)用觀察者的方法從頭創(chuàng)建一個(gè)Observable
Empty/Never/Throw
創(chuàng)建行為受限的特殊Observable
Defer
在觀察者訂閱之前不創(chuàng)建這個(gè)Observable额嘿,為每一個(gè)觀察者創(chuàng)建一個(gè)新的Observable
Just
將對(duì)象或者對(duì)象集合轉(zhuǎn)換為一個(gè)會(huì)發(fā)射這些對(duì)象的Observable
From
將其它的對(duì)象或數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換為Observable
Range
創(chuàng)建發(fā)射指定范圍的整數(shù)序列的Observable,range操作符,發(fā)射從start開始的count個(gè)數(shù)
Interval
間隔一定時(shí)間發(fā)送一個(gè)數(shù)字,從0開始.本身運(yùn)行在Schedulers.computation() 線程內(nèi)
Repeat
Repeat作用在Observable上,會(huì)對(duì)其重復(fù)發(fā)射count次
Timer
Timer會(huì)在指定時(shí)間后發(fā)射一個(gè)數(shù)字0,注意其也是運(yùn)行在computation Scheduler
變換操作
對(duì)Observable發(fā)射的數(shù)據(jù)進(jìn)行變骑科,能將數(shù)據(jù)轉(zhuǎn)化為我們想要的格式,
Buffer
緩存构拳,可以簡(jiǎn)單的理解為緩存咆爽,它定期從Observable收集數(shù)據(jù)到一個(gè)集合梁棠,然后把這些數(shù)據(jù)集合打包發(fā)射,而不是一次發(fā)射一個(gè)
FlatMap
扁平映射斗埂,將Observable發(fā)射的數(shù)據(jù)變換為Observables集合符糊,然后將這些Observable發(fā)射的數(shù)據(jù)平坦化的放進(jìn)一個(gè)單獨(dú)的Observable,可以認(rèn)為是一個(gè)將嵌套的數(shù)據(jù)結(jié)構(gòu)展開的過程呛凶。
GroupBy
分組男娄,將原來的Observable分拆為Observable集合,將原始Observable發(fā)射的數(shù)據(jù)按Key分組漾稀,每一個(gè)Observable發(fā)射一組不同的數(shù)據(jù)
Map
映射模闲,通過對(duì)序列的每一項(xiàng)都應(yīng)用一個(gè)函數(shù)變換Observable發(fā)射的數(shù)據(jù),實(shí)質(zhì)是對(duì)序列中的每一項(xiàng)執(zhí)行一個(gè)函數(shù)崭捍,函數(shù)的參數(shù)就是這個(gè)數(shù)據(jù)項(xiàng)
Scan
掃描尸折, 連續(xù)地對(duì)數(shù)據(jù)序列的每一項(xiàng)應(yīng)用一個(gè)函數(shù),然后連續(xù)發(fā)射結(jié)果,每一項(xiàng)結(jié)果基于之前的結(jié)果.累加器函數(shù).
Window
窗口殷蛇,定期將來自O(shè)bservable的數(shù)據(jù)分拆成一些Observable窗口实夹,然后發(fā)射這些窗口,而不是每次發(fā)射一項(xiàng)晾咪。類似于Buffer收擦,但Buffer發(fā)射的是數(shù)據(jù),Window發(fā)射的是Observable谍倦,每一個(gè)Observable發(fā)射原始Observable的數(shù)據(jù)的一個(gè)子集
toList
Returns an Observable that emits a single item, a list composed of all the items emitted by the source Observable. 將一個(gè)Observable轉(zhuǎn)換為一個(gè)List.
過濾操作
濾掉數(shù)據(jù)集合中我們不想要的數(shù)據(jù)塞赂。用于從Observable發(fā)射的數(shù)據(jù)中進(jìn)行選擇。
throttleWithTimeout
源Observable每次發(fā)射出來一個(gè)數(shù)據(jù)后就會(huì)進(jìn)行計(jì)時(shí),如果在設(shè)定好的時(shí)間結(jié)束前源Observable有新的數(shù)據(jù)發(fā)射出來昼蛀,這個(gè)數(shù)據(jù)就會(huì)被丟棄宴猾,同時(shí)重新開始計(jì)時(shí)。
Debounce
只有在空閑了一段時(shí)間后才發(fā)射數(shù)據(jù)叼旋,通俗的說仇哆,就是如果一段時(shí)間沒有操作,就執(zhí)行一次操作.還可以根據(jù)一個(gè)函數(shù)來進(jìn)行限流夫植。這個(gè)函數(shù)的返回值是一個(gè)臨時(shí)Observable讹剔,
如果源Observable在發(fā)射一個(gè)新的數(shù)據(jù)的時(shí)候,上一個(gè)數(shù)據(jù)根據(jù)函數(shù)所生成的臨時(shí)Observable還沒有結(jié)束,沒有調(diào)用onComplete详民,那么上一個(gè)數(shù)據(jù)就會(huì)被過濾掉延欠。如果是最后一個(gè),還是會(huì)發(fā)射.
Distinct
去重,過濾掉所有的重復(fù)數(shù)據(jù)項(xiàng)
DistinctUtilChanged
過濾掉相鄰的重復(fù)項(xiàng)
ElementAt
取值沈跨,取特定位置的數(shù)據(jù)項(xiàng)
Filter
過濾由捎,過濾掉沒有通過謂詞測(cè)試的數(shù)據(jù)項(xiàng),只發(fā)射通過測(cè)試的
First
取滿足條件的第一個(gè),如無滿足條件數(shù)據(jù)拋出異常.可以使用takeFisrt(),僅會(huì)調(diào)動(dòng)onComplete.
有null數(shù)據(jù)時(shí)會(huì)拋空指針異常,要判空處理.
只取滿足條件的第一個(gè)數(shù)據(jù).可以和BlockingObservable連用饿凛∧辏可以O(shè)bservable.toBlocking或者BlockingObservable.from方法來將一個(gè)Observable對(duì)象轉(zhuǎn)化為BlockingObservable對(duì)象
Last
末項(xiàng)帐姻,只發(fā)射最后一條數(shù)據(jù).
IgnoreElements
忽略所有的數(shù)據(jù)冈钦,只保留終止通知(onError或onCompleted)
Sample
取樣瓣铣,定期發(fā)射最新的數(shù)據(jù)飞蹂,等于是數(shù)據(jù)抽樣悠垛,有的實(shí)現(xiàn)里叫ThrottleFirst
throttleFirst
會(huì)定期發(fā)射這個(gè)時(shí)間段里源Observable發(fā)射的第一個(gè)數(shù)據(jù)
Skip
跳過前面的若干項(xiàng)數(shù)據(jù)
SkipLast
跳過后面的若干項(xiàng)數(shù)據(jù)
Take
只保留前面的若干項(xiàng)數(shù)據(jù)
TakeLast
只保留后面的若干項(xiàng)數(shù)據(jù)
takeFirst
有null數(shù)據(jù)時(shí)會(huì)拋空指針異常,要判空處理
和first一樣锈嫩,但在所有數(shù)據(jù)不滿足條件時(shí)不會(huì)拋出異常胁附,僅僅調(diào)用onComplete.
組合操作
And/Then/When
通過模式(And條件)和計(jì)劃(Then次序)組合兩個(gè)或多個(gè)Observable發(fā)射的數(shù)據(jù)集
CombineLatest
當(dāng)兩個(gè)Observables中的任何一個(gè)發(fā)射了一個(gè)數(shù)據(jù)時(shí)榴啸,通過一個(gè)指定的函數(shù)組合每個(gè)Observable發(fā)射的最新數(shù)據(jù)(一共兩個(gè)數(shù)據(jù)),然后發(fā)射這個(gè)函數(shù)的結(jié)果
必須滿足兩個(gè)條件:
1)所有的Observable都發(fā)射過數(shù)據(jù)膳凝。
2)滿足條件1的時(shí)候任何一個(gè)Observable發(fā)射一個(gè)數(shù)據(jù),就將所有Observable最新發(fā)射的數(shù)據(jù)按照提供的函數(shù)組裝起來發(fā)射出去恭陡。
在這兩個(gè)條件下,可能會(huì)忽略掉一些發(fā)射的數(shù)據(jù).
Join
無論何時(shí)蹬音,如果一個(gè)Observable發(fā)射了一個(gè)數(shù)據(jù)項(xiàng),只要在另一個(gè)Observable發(fā)射的數(shù)據(jù)項(xiàng)定義的時(shí)間窗口內(nèi)休玩,就將兩個(gè)Observable發(fā)射的數(shù)據(jù)合并發(fā)射
參數(shù)說明:
1)源Observable所要組合的目標(biāo)Observable
2)一個(gè)函數(shù)著淆,就收從源Observable發(fā)射來的數(shù)據(jù),并返回一個(gè)Observable拴疤,這個(gè)Observable的生命周期決定了源Observable發(fā)射出來數(shù)據(jù)的有效期
3)一個(gè)函數(shù)永部,就收從目標(biāo)Observable發(fā)射來的數(shù)據(jù),并返回一個(gè)Observable呐矾,這個(gè)Observable的生命周期決定了目標(biāo)Observable發(fā)射出來數(shù)據(jù)的有效期
4)一個(gè)函數(shù)苔埋,接收從源Observable和目標(biāo)Observable發(fā)射來的數(shù)據(jù),并返回最終組合完的數(shù)據(jù)蜒犯。
Merge
將兩個(gè)Observable發(fā)射的數(shù)據(jù)組合并成一個(gè)
Merge可能會(huì)讓合并的Observables發(fā)射的數(shù)據(jù)交錯(cuò)(可以使用Concat操作符,不會(huì)讓數(shù)據(jù)交錯(cuò)组橄,它會(huì)按順序一個(gè)接著一個(gè)發(fā)射多個(gè)Observables的發(fā)射物)。
StartWith
在發(fā)射原來的Observable的數(shù)據(jù)序列之前罚随,先發(fā)射一個(gè)指定的數(shù)據(jù)序列或數(shù)據(jù)項(xiàng)
在數(shù)據(jù)序列的開頭插入一條指定的項(xiàng)
你也可以傳遞一個(gè)Observable給startWith玉工,
它會(huì)將那個(gè)Observable的發(fā)射物插在原始Observable發(fā)射的數(shù)據(jù)序列之前.這可以看作是Concat的反轉(zhuǎn)。
Switch淘菩,在RxJava的實(shí)現(xiàn)為SwitchOnNext
將一個(gè)發(fā)射Observable序列的Observable轉(zhuǎn)換為這樣一個(gè)Observable:它逐個(gè)發(fā)射那些Observable最近發(fā)射的數(shù)據(jù)
用來將一個(gè)發(fā)射多個(gè)小Observable的源Observable轉(zhuǎn)化為一個(gè)Observable遵班,然后發(fā)射這多個(gè)小Observable所發(fā)射的數(shù)據(jù)。
需要注意的就是潮改,如果一個(gè)小的Observable正在發(fā)射數(shù)據(jù)的時(shí)候狭郑,源Observable又發(fā)射出一個(gè)新的小Observable,則前一個(gè)Observable發(fā)射的數(shù)據(jù)會(huì)被拋棄进陡,直接發(fā)射新的小Observable所發(fā)射的數(shù)據(jù)愿阐。
Zip
zip zipWith
打包,使用一個(gè)指定的函數(shù)將多個(gè)Observable發(fā)射的數(shù)據(jù)組合在一起趾疚,然后將這個(gè)函數(shù)的結(jié)果作為單項(xiàng)數(shù)據(jù)發(fā)射
Zip操作符將多個(gè)Observable發(fā)射的數(shù)據(jù)按順序組合起來缨历,每個(gè)數(shù)據(jù)只能組合一次以蕴,而且都是有序的。
最終組合的數(shù)據(jù)的數(shù)量由發(fā)射數(shù)據(jù)最少的Observable來決定辛孵。
錯(cuò)誤處理
這些操作符用于從錯(cuò)誤通知中恢復(fù)
Catch
捕獲丛肮,繼續(xù)序列操作,將錯(cuò)誤替換為正常的數(shù)據(jù)魄缚,從onError通知中恢復(fù)
onErrorReturn
當(dāng)發(fā)生錯(cuò)誤的時(shí)候宝与,讓Observable發(fā)射一個(gè)預(yù)先定義好的數(shù)據(jù)并正常地終止,不會(huì)拋出異常 onErrorResumeNext
當(dāng)發(fā)生錯(cuò)誤的時(shí)候,由另外一個(gè)Observable來代替當(dāng)前的Observable并繼續(xù)發(fā)射數(shù)據(jù) onExceptionResumeNext
類似于OnErrorResume,不同之處在于其會(huì)對(duì)onError拋出的數(shù)據(jù)類型做判斷冶匹,
如果是Exception习劫,也會(huì)使用另外一個(gè)Observable代替原Observable繼續(xù)發(fā)射數(shù)據(jù),
否則會(huì)將錯(cuò)誤分發(fā)給Subscriber嚼隘。
Retry
重試诽里,如果Observable發(fā)射了一個(gè)錯(cuò)誤通知,重新訂閱它飞蛹,期待它正常終止
retry
Retry操作符在發(fā)生錯(cuò)誤的時(shí)候會(huì)重新進(jìn)行訂閱,而且可以重復(fù)多次谤狡,
所以發(fā)射的數(shù)據(jù)可能會(huì)產(chǎn)生重復(fù)。如果重復(fù)指定次數(shù)還有錯(cuò)誤的話就會(huì)將錯(cuò)誤返回給觀察者,會(huì)掉onError retryWhen
當(dāng)錯(cuò)誤發(fā)生時(shí)卧檐,retryWhen會(huì)接收onError的throwable作為參數(shù)墓懂,并根據(jù)定義好的函數(shù)返回一個(gè)Observable,如果這個(gè)Observable發(fā)射一個(gè)數(shù)據(jù)霉囚,就會(huì)重新訂閱捕仔。
需要注意的是使用retryWhen的時(shí)候,因?yàn)槊看沃匦掠嗛喍紩?huì)產(chǎn)生錯(cuò)誤,所以作為參數(shù)的obserbvable會(huì)不斷地發(fā)射數(shù)據(jù)佛嬉,使用zipWith操作符可以限制重新訂閱的次數(shù)逻澳,否則會(huì)無限制地重新訂閱。
會(huì)正常結(jié)束,調(diào)用onCompleted
輔助操作
Delay
延遲一段時(shí)間發(fā)射結(jié)果數(shù)據(jù)
DelaySubscription
延遲注冊(cè)到Observer上
Do
Do操作符就是給Observable的生命周期的各個(gè)階段加上一系列的回調(diào)監(jiān)聽暖呕,當(dāng)Observable執(zhí)行到這個(gè)階段的時(shí)候斜做,這些回調(diào)就會(huì)被觸發(fā).
doOnEach
Observable每發(fā)射一個(gè)數(shù)據(jù)的時(shí)候就會(huì)觸發(fā)這個(gè)回調(diào),不僅包括onNext還包括onError和onCompleted湾揽。
doOnNext
只有onNext的時(shí)候才會(huì)被觸發(fā)瓤逼。
doOnSubscribe,doOnUnSubscribe
會(huì)在Subscriber進(jìn)行訂閱和反訂閱的時(shí)候觸發(fā)回調(diào)。
當(dāng)一個(gè)Observable通過OnError或者OnCompleted結(jié)束的時(shí)候库物,會(huì)反訂閱所有的Subscriber霸旗。在Android中和生命周期綁定起來,因?yàn)橛行㎡bservable執(zhí)行不完啊.
doOnSubscribeOn
在開始注冊(cè)前做一些工作。處于當(dāng)前線程戚揭,而不是subscribeOn指定的線程诱告。
DoOnError
在OnError發(fā)生的時(shí)候觸發(fā)回調(diào),并將Throwable對(duì)象作為參數(shù)傳進(jìn)回調(diào)函數(shù)里民晒。
DoOnComplete
會(huì)在OnCompleted發(fā)生的時(shí)候觸發(fā)回調(diào)精居。
DoOnTerminate
會(huì)在Observable結(jié)束前觸發(fā)回調(diào)锄禽,無論是正常還是異常終止。
finallyDo,doAfterTerminate
會(huì)在Observable結(jié)束后觸發(fā)回調(diào)靴姿,無論是正常還是異常終止沃但。
Materialize,dematerialize
Meterialize操作符將OnNext/OnError/OnComplete都轉(zhuǎn)化為一個(gè)Notification對(duì)象并按照原來的順序發(fā)射出來,dematerialize相反
使用integerNotification.getValue() +”, ” + integerNotification.getKind()可以看到打印值和類型.
ObserveOn
指定Subscriber的調(diào)度程序(工作線程)
SubscribeOn
指定Observable應(yīng)該在哪個(gè)調(diào)度程序上執(zhí)行
Serialize
強(qiáng)制Observable按次序發(fā)射數(shù)據(jù)并且功能是有效的
Subscribe
收到Observable發(fā)射的數(shù)據(jù)和通知后執(zhí)行的操作
TimeInterval
將一個(gè)Observable轉(zhuǎn)換為發(fā)射兩個(gè)數(shù)據(jù)之間所耗費(fèi)時(shí)間的Observable
TimeInterval會(huì)攔截發(fā)射出來的數(shù)據(jù),取代為前后兩個(gè)發(fā)射兩個(gè)數(shù)據(jù)的間隔時(shí)間佛吓。對(duì)于第一個(gè)發(fā)射的數(shù)據(jù)宵晚,其時(shí)間間隔為訂閱后到首次發(fā)射的間隔。
Timeout
添加超時(shí)機(jī)制维雇,如果過了指定的一段時(shí)間沒有發(fā)射數(shù)據(jù)淤刃,就發(fā)射一個(gè)錯(cuò)誤通知
Timeout操作符給Observable加上超時(shí)時(shí)間,每發(fā)射一個(gè)數(shù)據(jù)后就重置計(jì)時(shí)器谆沃,當(dāng)超過預(yù)定的時(shí)間還沒有發(fā)射下一個(gè)數(shù)據(jù)钝凶,就拋出一個(gè)超時(shí)的異常。
Rxjava將Timeout實(shí)現(xiàn)為很多不同功能的操作符唁影,比如說超時(shí)后用一個(gè)備用的Observable繼續(xù)發(fā)射數(shù)據(jù)等。
Timestamp
給Observable發(fā)射的每個(gè)數(shù)據(jù)項(xiàng)添加一個(gè)時(shí)間戳
TimeStamp會(huì)將每個(gè)數(shù)據(jù)項(xiàng)給重新包裝一下掂名,加上了一個(gè)時(shí)間戳來標(biāo)明每次發(fā)射的時(shí)間
Using
創(chuàng)建一個(gè)只在Observable的生命周期內(nèi)存在的一次性資源
Using操作符創(chuàng)建一個(gè)在Observable生命周期內(nèi)存活的資源据沈,也可以這樣理解:
我們創(chuàng)建一個(gè)資源并使用它,用一個(gè)Observable來限制這個(gè)資源的使用時(shí)間饺蔑,當(dāng)這個(gè)Observable終止的時(shí)候锌介,這個(gè)資源就會(huì)被銷毀。
Using需要使用三個(gè)參數(shù)猾警,分別是:
1)創(chuàng)建這個(gè)一次性資源的函數(shù)
2)創(chuàng)建Observable的函數(shù)
3)釋放資源的函數(shù)
條件和布爾操作
這些操作符可用于單個(gè)或多個(gè)數(shù)據(jù)項(xiàng)孔祸,也可用于Observable
All
判斷Observable發(fā)射的所有的數(shù)據(jù)項(xiàng)是否都滿足某個(gè)條件
All操作符根據(jù)一個(gè)函數(shù)對(duì)源Observable發(fā)射的所有數(shù)據(jù)進(jìn)行判斷,最終返回的結(jié)果就是這個(gè)判斷結(jié)果发皿。
對(duì)發(fā)射的所有數(shù)據(jù)應(yīng)用這個(gè)函數(shù),如果全部都滿足則返回true崔慧,否則就返回false。
Amb
Amb操作符可以將至多9個(gè)Observable結(jié)合起來穴墅,讓他們競(jìng)爭(zhēng)惶室。
哪個(gè)Observable首先發(fā)射了數(shù)據(jù)(包括onError和onComplete)就會(huì)繼續(xù)發(fā)射這個(gè)Observable的數(shù)據(jù),其他的Observable所發(fā)射的數(shù)據(jù)都會(huì)別丟棄玄货。
Contains
判斷Observable是否會(huì)發(fā)射一個(gè)指定的數(shù)據(jù)項(xiàng)
Contains操作符用來判斷源Observable所發(fā)射的數(shù)據(jù)是否包含某一個(gè)數(shù)據(jù)皇钞,如果包含會(huì)返回true,如果源Observable已經(jīng)結(jié)束了卻還沒有發(fā)射這個(gè)數(shù)據(jù)則返回false松捉。
IsEmpty
IsEmpty操作符用來判斷源Observable是否發(fā)射過數(shù)據(jù)夹界,沒有發(fā)射過數(shù)據(jù)返回true.
Null也是一個(gè)數(shù)據(jù)
DefaultIfEmpty
發(fā)射來自原始Observable的數(shù)據(jù),如果原始Observable沒有發(fā)射數(shù)據(jù)隘世,就發(fā)射一個(gè)默認(rèn)數(shù)據(jù)
會(huì)判斷源Observable是否發(fā)射數(shù)據(jù)可柿,如果源Observable發(fā)射了數(shù)據(jù)則正常發(fā)射這些數(shù)據(jù)鸠踪,如果沒有則發(fā)射一個(gè)默認(rèn)的數(shù)據(jù)
SequenceEqual
判斷兩個(gè)Observable是否按相同的數(shù)據(jù)序列
SequenceEqual操作符用來判斷兩個(gè)Observable發(fā)射的數(shù)據(jù)序列是否相同(發(fā)射的數(shù)據(jù)相同,數(shù)據(jù)的序列相同趾痘,結(jié)束的狀態(tài)相同)慢哈,如果相同返回true,否則返回false
SkipUntil
SkipUnitl是根據(jù)一個(gè)標(biāo)志Observable來判斷的永票,當(dāng)這個(gè)標(biāo)志Observable沒有發(fā)射數(shù)據(jù)的時(shí)候卵贱,所有源Observable發(fā)射的數(shù)據(jù)都會(huì)被跳過;當(dāng)標(biāo)志Observable發(fā)射了一個(gè)數(shù)據(jù)侣集,則開始正常地發(fā)射數(shù)據(jù)键俱。
一直等到skipUntil發(fā)射了數(shù)據(jù)才能發(fā)射源Observable的數(shù)據(jù),并忽略了此段時(shí)間內(nèi)的數(shù)據(jù)
SkipWhile
SkipWhile則是根據(jù)一個(gè)函數(shù)來判斷是否跳過數(shù)據(jù),當(dāng)函數(shù)返回值為true的時(shí)候則一直跳過源Observable發(fā)射的數(shù)據(jù)世分;當(dāng)函數(shù)返回false的時(shí)候則開始正常發(fā)射數(shù)據(jù)编振。
TakeUntil
和SkipUtil恰好相反,只獲取takeUntil里的Observable之前的數(shù)據(jù)
TakeWhile
和SkipWhile相反,獲取滿足skipWhile的數(shù)據(jù)
算術(shù)和聚合操作
Concat
將多個(gè)Observable結(jié)合成一個(gè)Observable并發(fā)射數(shù)據(jù),并且嚴(yán)格按照先后順序發(fā)射數(shù)據(jù)臭埋,前一個(gè)Observable的數(shù)據(jù)沒有發(fā)射完踪央,不發(fā)射后面Observable的數(shù)據(jù)
Count
Count操作符用來統(tǒng)計(jì)源Observable發(fā)射了多少個(gè)數(shù)據(jù),最后將數(shù)目給發(fā)射出來瓢阴;
如果源Observable發(fā)射錯(cuò)誤畅蹂,則會(huì)將錯(cuò)誤直接報(bào)出來;在源Observable沒有終止前荣恐,count是不會(huì)發(fā)射統(tǒng)計(jì)數(shù)據(jù)的液斜。
Reduce
Reduce操作符應(yīng)用一個(gè)函數(shù)接收Observable發(fā)射的數(shù)據(jù)和函數(shù)的計(jì)算結(jié)果作為下次計(jì)算的參數(shù),輸出最后的結(jié)果叠穆。
跟前面我們了解過的scan操作符很類似少漆,只是scan會(huì)輸出每次計(jì)算的結(jié)果,而reduce只會(huì)輸出最后的結(jié)果硼被。
Collect
collect用來將源Observable發(fā)射的數(shù)據(jù)給收集到一個(gè)數(shù)據(jù)結(jié)構(gòu)里面示损,需要使用兩個(gè)參數(shù):
一個(gè)產(chǎn)生收集數(shù)據(jù)結(jié)構(gòu)的函數(shù)
一個(gè)接收第一個(gè)函數(shù)產(chǎn)生的數(shù)據(jù)結(jié)構(gòu)和源Observable發(fā)射的數(shù)據(jù)作為參數(shù)的函數(shù)。
連接操作
一些有精確可控的訂閱行為的特殊Observable
什么是Connectable Observable:
就是一種特殊的Observable對(duì)象祷嘶,并不是Subscrib的時(shí)候就發(fā)射數(shù)據(jù)屎媳,而是只有對(duì)其應(yīng)用connect操作符的時(shí)候才開始發(fā)射數(shù)據(jù),
所以可以用來更靈活的控制數(shù)據(jù)發(fā)射的時(shí)機(jī)论巍。
使用Publish操作符將Observable轉(zhuǎn)換為Connectable Observable,然后可以通過connect控制何時(shí)發(fā)射.
Publish
將一個(gè)普通的Observable轉(zhuǎn)換為可連接的
Publish操作符就是用來將一個(gè)普通的Observable對(duì)象轉(zhuǎn)化為一個(gè)Connectable Observable烛谊。需要注意的是如果發(fā)射數(shù)據(jù)已經(jīng)開始了再進(jìn)行訂閱只能接收以后發(fā)射的數(shù)據(jù)。
Connect
Connect操作符就是用來觸發(fā)Connectable Observable發(fā)射數(shù)據(jù)的嘉汰。
應(yīng)用Connect操作符后會(huì)返回一個(gè)Subscription對(duì)象丹禀,通過這個(gè)Subscription對(duì)象,我們可以調(diào)用其unsubscribe方法來終止數(shù)據(jù)的發(fā)射。
另外双泪,如果還沒有訂閱者訂閱的時(shí)候就應(yīng)用Connect操作符也是可以使其開始發(fā)射數(shù)據(jù)的持搜。
RefCount
RefCount操作符就是將一個(gè)Connectable Observable 對(duì)象再重新轉(zhuǎn)化為一個(gè)普通的Observable對(duì)象,這時(shí)候訂閱者進(jìn)行訂閱時(shí)就會(huì)觸發(fā)數(shù)據(jù)的發(fā)射焙矛。
Replay
Replay操作符返回一個(gè)Connectable Observable 對(duì)象并且可以緩存其發(fā)射過的數(shù)據(jù)葫盼,這樣即使有訂閱者在其發(fā)射數(shù)據(jù)之后進(jìn)行訂閱也能收到其之前發(fā)射過的數(shù)據(jù)。
不過使用Replay操作符我們最好還是限定其緩存的大小村斟,否則緩存的數(shù)據(jù)太多了可會(huì)占用很大的一塊內(nèi)存贫导。
對(duì)緩存的控制可以從空間和時(shí)間兩個(gè)方面來實(shí)現(xiàn)。
直接返回一個(gè)connectable observable,不用publish
轉(zhuǎn)換操作
to
自定義操作符
lift compose