RXSwift - flatMap flatMapLast


因?yàn)楝F(xiàn)實(shí)中很多事件都是異步發(fā)生的,而并不是像Observable.of創(chuàng)建的看起來(lái)像集合這樣的。因此,當(dāng)我們需要對(duì)異步發(fā)生的事件序列進(jìn)行變換的時(shí)候,就需要訂閱原來(lái)的事件序列,對(duì)異步發(fā)生的事件有所察覺(jué)。其中,網(wǎng)絡(luò)編程就是一個(gè)最典型的例子。為了在請(qǐng)求一個(gè)網(wǎng)絡(luò)資源后,根據(jù)服務(wù)器返回的結(jié)果對(duì)原事件序列進(jìn)行變換,flatMap就是最好的選擇。

enum E : Error {
    case demoAError
    case demoBError
}

struct Player {
    var score: BehaviorRelay<Int>
}

flatMap :1、把序列中的事件變成新的Observable 2、合并所有轉(zhuǎn)換過(guò)的序列

        let bag = DisposeBag()
        
        let John = Player (score: BehaviorRelay (value: 70))
        let Jole = Player (score: BehaviorRelay (value: 90))
        
        let players = PublishSubject<Player>()
        
        players.asObserver().flatMap { (player:Player) -> Observable<Int> in
            player.score.asObservable()
        }.subscribe(onNext: { (num) in
            print(num)
        }, onError: { (_) in
            print("Error")
        }, onCompleted: {
            print("onCompleted")
        }) {
            print("onDisposed")
        }.disposed(by: bag)
        
        
        players.onNext(John)
        
        John.score.accept(75)
        players.onNext(Jole)
        John.score.accept(85)

執(zhí)行過(guò)程

----------John-----------------------Jole------------------------------------
         
         flatMap{ $0.score.asObservable() }
         
-----------70------------75---------------------------85---------------------
         
--------------------------------------90-------------------------------------
         
         
-----------70------------75-----------90--------------85----------------------

\color{#DEB887}{執(zhí)行結(jié)果:70 -> 75 -> 90 -> 85 -> onDisposed }

note

  • flatMap 會(huì)把原序列中事件,轉(zhuǎn)變成observable。當(dāng)最早的 John 加入后, 把John 中的事件轉(zhuǎn)換成observable (介紹部分 1 ), 緊接著 Jole 加入, flatMap 同樣把他的事件也轉(zhuǎn)換成了 Observable, 并把兩個(gè) Observable<Int> 合并(介紹部分 2)。

  • John, 70 是初始化的值,75是第一個(gè) accept 的值,它屬于 John observable

  • Jole, 90 是初始化值嗎,它屬于 Jole observable

  • flatMap 合并了 John 和 Jole 兩個(gè)observable , 所以 John accpet 85 , 還是能接受到信號(hào)的。

flatMapLast:當(dāng)原序列有新的事件發(fā)生的時(shí)候,flatMapLast 會(huì)自動(dòng)取消上一個(gè)事件的訂閱,轉(zhuǎn)到新的事件的訂閱上面, flatMap則會(huì)訂閱全部。

        let bag = DisposeBag()
        
        let John = Player (score: BehaviorRelay (value: 70))
        let Jole = Player (score: BehaviorRelay (value: 90))
        
        let players = PublishSubject<Player>()
        
        players.asObserver().flatMapLatest { (player:Player) -> Observable<Int> in
            player.score.asObservable()
        }.subscribe(onNext: { (num) in
            print(num)
        }, onError: { (_) in
            print("Error")
        }, onCompleted: {
            print("onCompleted")
        }) {
            print("onDisposed")
        }.disposed(by: bag)
        
        
        players.onNext(John)
        
        John.score.accept(75)
        players.onNext(Jole)
        John.score.accept(85)

執(zhí)行過(guò)程

----------John-----------------------Jole------------------------------------
         
         flatMapLatest{ $0.score.asObservable() }
         
-----------70------------75---------------------------85---------------------
         
--------------------------------------90-------------------------------------
         
         
-----------70------------75------------90--------------------------------------

\color{#DEB887}{執(zhí)行結(jié)果:70 -> 75 -> 90 -> onDisposed}

note

  • 70、 75 是屬于 John Observable<Int>, flatMapLast 當(dāng)前監(jiān)聽(tīng)的就是 John Observable<Int>
  • 90、 是屬于 Jole Observable<Int>, flatMapLast 當(dāng)前監(jiān)聽(tīng)的就是 John Observable<Int> , 就會(huì)取消對(duì) John Observable<Int> 監(jiān)聽(tīng)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容