美文网首页
RXSwift - flatMap flatMapLast

RXSwift - flatMap flatMapLast

作者: 内蒙小猿 | 来源:发表于2020-08-22 06:13 被阅读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

  • flatMap 会把原序列中事件,转变成observable。当最早的 John 加入后, 把John 中的事件转换成observable (介绍部分 1 ), 紧接着 Jole 加入, flatMap 同样把他的事件也转换成了 Observable, 并把两个 Observable<Int> 合并(介绍部分 2)。

  • John, 70 是初始化的值,75是第一个 accept 的值,它属于 John observable

  • Jole, 90 是初始化值吗,它属于 Jole observable

  • flatMap 合并了 John 和 Jole 两个observable , 所以 John accpet 85 , 还是能接受到信号的。

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

  • 70、 75 是属于 John Observable<Int>, flatMapLast 当前监听的就是 John Observable<Int>
  • 90、 是属于 Jole Observable<Int>, flatMapLast 当前监听的就是 John Observable<Int> , 就会取消对 John Observable<Int> 监听

相关文章

网友评论

      本文标题:RXSwift - flatMap flatMapLast

      本文链接:https://www.haomeiwen.com/subject/hxcejktx.html