RXSwift - flatMap flatMapLast

2020-08-22  本文已影响0人  内蒙小猿

因为现实中很多事件都是异步发生的,而并不是像Observable.of创建的看起来像集合这样的。因此,当我们需要对异步发生的事件序列进行变换的时候,就需要订阅原来的事件序列,对异步发生的事件有所察觉。其中,网络编程就是一个最典型的例子。为了在请求一个网络资源后,根据服务器返回的结果对原事件序列进行变换,flatMap就是最好的选择。

enum E : Error {
    case demoAError
    case demoBError
}

struct Player {
    var score: BehaviorRelay<Int>
}

flatMap :1、把序列中的事件变成新的Observable 2、合并所有转换过的序列

        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)

执行过程

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

\color{#DEB887}{执行结果:70 -> 75 -> 90 -> 85 -> onDisposed }

note

flatMapLast:当原序列有新的事件发生的时候,flatMapLast 会自动取消上一个事件的订阅,转到新的事件的订阅上面, flatMap则会订阅全部。

        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)

执行过程

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

\color{#DEB887}{执行结果:70 -> 75 -> 90 -> onDisposed}

note

上一篇 下一篇

猜你喜欢

热点阅读