生活随笔
收集整理的這篇文章主要介紹了
RxSwift之深入解析如何创建Observable序列
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
一、emty
創(chuàng)建一個空的序列:本來序列事件是 Int 類型的,調(diào)用 emty 函數(shù)沒有序列,只能 complete:
let emtyOb
= Observable < Int > . empty ( ) _ = emtyOb
. subscribe ( onNext
: { ( number
) in print ( "訂閱:" , number
) } , onError
: { ( error
) in print ( "error:" , error
) } , onCompleted
: { print ( "完成回調(diào)" ) } ) { print ( "釋放回調(diào)" ) }
這種方式不常用,但是以點及面展開分析,通過源碼解析查看:
override func subscribe
< O
: ObserverType > ( _ observer
: O
) - > Disposable where O
. E
== Element { observer
. on ( . completed
) return Disposables . create ( ) }
很明顯在訂閱的時候,直接 observer.on(.completed) 發(fā)送了完成信號,非常簡潔:
二、just
單個信號序列創(chuàng)建,該方法通過傳入一個默認(rèn)值來初始化,構(gòu)建一個只有一個元素的 Observable 隊列,訂閱完信息自動 complete。 如下所示,顯示地標(biāo)注出了 Observable 的類型為 Observable<[String]>,即指定了 Observable 所發(fā)出的事件攜帶的數(shù)據(jù)類型必須是String 類型的:
let array
= [ "A" , "B" ] Observable < [ String ] > . just ( array
) . subscribe
{ ( event
) in print ( event
) } . disposed ( by
: disposeBag
) _ = Observable < [ String ] > . just ( array
) . subscribe ( onNext
: { ( number
) in print ( "訂閱:" , number
) } , onError
: { ( error
) in print ( "error:" , error
) } , onCompleted
: { print ( "完成回調(diào)" ) } ) { print ( "釋放回調(diào)" ) }
just 序列在平時開發(fā)里面還是應(yīng)用挺多的,底層源碼如下:
override func subscribe
< O
: ObserverType > ( _ observer
: O
) - > Disposable where O
. E
== Element { observer
. on ( . next ( self . _element
) ) observer
. on ( . completed
) return Disposables . create ( ) }
observer.on(.next(self._element)) 常規(guī)訂閱之后就會發(fā)送 .next 事件,之后就會自動發(fā)送完成事件:
三、of
此方法創(chuàng)建一個新的可觀察實例,該實例具有可變數(shù)量的元素。 該方法可以接受可變數(shù)量的參數(shù)(必需要是同類型的):
Observable < String > . of ( "A" , "B" ) . subscribe
{ ( event
) in print ( event
) } . disposed ( by
: disposeBag
) Observable < [ String : Any ] > . of ( [ "name" : "ydw" , "age" : 18 ] ) . subscribe
{ ( event
) in print ( event
) } . disposed ( by
: disposeBag
) Observable < [ String ] > . of ( [ "A" , "B" ] ) . subscribe
{ ( event
) in print ( event
) } . disposed ( by
: disposeBag
)
無論字典、數(shù)組、多個元素都可以正常使用,初始化保存調(diào)度環(huán)境和傳入的元素 訂閱流程也是利用 sink,然后通過 mutableIterator 迭代器處理發(fā)送:
四、from
將可選序列轉(zhuǎn)換為可觀察序列。從集合中獲取序列:數(shù)組、集合、set 獲取序列,有可選項處理,更安全。 從一個序列 (如Array/Dictionary/Set) 中創(chuàng)建一個 Observable 序列:
Observable < [ String ] > . from ( optional : [ "A" , "B" ] ) . subscribe
{ ( event
) in print ( event
) } . disposed ( by
: disposeBag
)
self._optional = optional 底層初始化可選項保存,訂閱流程判斷是否匹配我可選項; 發(fā)送 observer.on(.next(element)) 序列 ,隨即自動 observer.on(.completed) 完成序列發(fā)送。
五、deferred
返回一個可觀察序列,該序列在新觀察者訂閱時調(diào)用指定的工廠函數(shù)。 使用 deferred() 方法延遲 Observable 序列的初始化,通過傳入的 block 來實現(xiàn) Observable 序列的初始化并且返回。
var isOdd
= true _ = Observable < Int > . deferred
{ ( ) - > Observable < Int > in isOdd
= ! isOdd
if isOdd
{ return Observable . of ( 1 , 3 , 5 , 7 , 9 ) } return Observable . of ( 0 , 2 , 4 , 6 , 8 ) } . subscribe
{ ( event
) in print ( event
) }
self._observableFactory = observableFactory 初始化保存工廠閉包:
func run ( ) - > Disposable { do { let result
= try self . _observableFactory ( ) return result
. subscribe ( self ) } catch let e
{ self . forwardOn ( . error ( e
) ) self . dispose ( ) return Disposables . create ( ) } }
在訂閱流程到 sink 的時候,執(zhí)行工廠閉包,有種中間層被包裝的感覺:
六、rang
使用指定的調(diào)度程序生成并發(fā)送觀察者消息,生成指定范圍內(nèi)的可觀察整數(shù)序列。 創(chuàng)建一個 Observable 序列,它會發(fā)出一系列連續(xù)的整數(shù),然后終止。
Observable . range ( start
: 2 , count : 5 ) . subscribe
{ ( event
) in print ( event
) } . disposed ( by
: disposeBag
) init ( start
: E
, count : E
, scheduler
: ImmediateSchedulerType ) { self . _start
= start
self . _count
= count self . _scheduler
= scheduler
} override func run
< O
: ObserverType > ( _ observer
: O
, cancel
: Cancelable ) - > ( sink
: Disposable , subscription
: Disposable ) where O
. E
== E
{ let sink
= RangeSink ( parent
: self , observer
: observer
, cancel
: cancel
) let subscription
= sink
. run ( ) return ( sink
: sink
, subscription
: subscription
) }
保存序列中第一個整數(shù)的值,要生成的順序整數(shù)的數(shù)目以及調(diào)度環(huán)境。
if i
< self . _parent
. _count
{ self . forwardOn ( . next ( self . _parent
. _start
+ i
) ) recurse ( i
+ 1 ) } else { self . forwardOn ( . completed
) self . dispose ( ) }
根據(jù)之前保存的信息,數(shù)據(jù)的狀態(tài)也不斷攀升,然后遞歸到規(guī)定的要求:
七、generate
通過運行產(chǎn)生序列元素的狀態(tài)驅(qū)動循環(huán),使用指定的調(diào)度程序運行循環(huán),發(fā)送觀察者消息,從而生成一個可觀察序列。 創(chuàng)建一個 Observable 序列,只要提供的條件值為 true 就可以生成值。 初始值給定,然后判斷條件 1 再判斷條件2 會一直遞歸下去,直到條件 1 或者條件 2 不滿足,類似數(shù)組遍歷循環(huán): 參數(shù)一 initialState: 初始狀態(tài); 參數(shù)二 condition:終止生成的條件(返回“false”時); 參數(shù)三 iterate:迭代步驟函數(shù); 參數(shù)四 調(diào)度器:用來運行生成器循環(huán)的調(diào)度器,默認(rèn):CurrentThreadScheduler.instance;
Observable . generate ( initialState
: 0 , condition
: { $
0 < 10 } , iterate
: { $
0 + 2 } ) . subscribe
{ ( event
) in print ( event
) } . disposed ( by
: disposeBag
) let arr
= [ "A" , "B" ] Observable . generate ( initialState
: 0 , condition
: { $
0 < arr
. count } , iterate
: { $
0 + 1 } ) . subscribe ( onNext
: { print ( "遍歷arr:" , arr
[ $
0 ] ) } ) . disposed ( by
: disposeBag
)
八、timer
獲取計時器 Observable 序列,返回一個可觀察序列,該序列使用指定的調(diào)度程序運行計時器,在指定的初始相對到期時間過后定期生成一個值: 第一次參數(shù):第一次響應(yīng)距離現(xiàn)在的時間;
Observable < Int > . timer ( 5 , period
: 2 , scheduler
: MainScheduler . instance
) . subscribe
{ ( event
) in print ( event
) } . disposed ( by
: disposeBag
) Observable < Int > . timer ( 1 , scheduler
: MainScheduler . instance
) . subscribe
{ ( event
) in print ( "\( event) " ) } . disposed ( by
: disposeBag
)
狀態(tài)碼的不斷攀升,間隔時間不斷發(fā)送響應(yīng):
九、interval
返回一個可觀察序列,該序列在每個周期之后生成一個值,使用指定的調(diào)度程序運行計時器并發(fā)送觀察者消息:
Observable < Int > . interval ( 1 , scheduler
: MainScheduler . instance
) . subscribe
{ ( event
) in print ( event
) } . disposed ( by
: disposeBag
)
十、repeatElement
使用指定的調(diào)度程序發(fā)送觀察者消息,生成無限重復(fù)給定元素的可觀察序列:
Observable < Int > . repeatElement ( 5 ) . subscribe
{ ( event
) in print ( "訂閱:" , event
) } . disposed ( by
: disposeBag
)
十一、error
創(chuàng)建一個不會發(fā)送任何條目并且立即終止錯誤的 Observable 序列,返回一個以“error”結(jié)束的可觀察序列。 error 序列平時在開發(fā)也比較常見,請求網(wǎng)絡(luò)失敗也會發(fā)送失敗信號:
Observable < String > . error ( NSError . init ( domain
: "dwerror" , code
: 10086 , userInfo
: [ "reason" : "unknow" ] ) ) . subscribe
{ ( event
) in print ( "訂閱:" , event
) } . disposed ( by
: disposeBag
)
十二、never
never 返回一個以“error”結(jié)束的可觀察序列,這個序列平時在開發(fā)也比較常見,請求網(wǎng)絡(luò)失敗也會發(fā)送失敗信號:
Observable < String > . never ( ) . subscribe
{ ( event
) in print ( "never:" , event
) } . disposed ( by
: disposeBag
)
十三、create()
該方法接受一個 閉包形式的參數(shù),任務(wù)是對每一個過來的訂閱進(jìn)行處理。這也是序列創(chuàng)建的一般方式,應(yīng)用非常之多:
let observable
= Observable < String > . create
{ observer
in observer
. onNext ( "ydw" ) observer
. onCompleted ( ) return Disposables . create ( ) } observable
. subscribe
{ print ( $
0 ) }
總結(jié)
以上是生活随笔 為你收集整理的RxSwift之深入解析如何创建Observable序列 的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔 推薦給好友。