一同养成写作习气!这是我参与「日新计划 4 月更文挑战」的第11天,点击检查活动概况。

本文主要介绍在RxSwift中映射操作map原理解析, 关于swift中的map可以看下之前的文章 swift的数组Swift中高阶函数的运用。本质上来说便是经过便利进行trasform转化,得到一个新的结构。

1. map

咱们先看下咱们运用RxSwift把咱们数组里的元素转化为字符串类型

let disposeBag = DisposeBag()
let ob = Observable.from([1,2,3])
        ob.map{"\($0)"}
        .subscribe(onNext: {print($0.description)})
          .disposed(by:disposeBag )//打印结果字符串1,2,3

咱们看下里边的完成,点击检查map

RxSwift学习-09-映射操作解析

它是可调查序列协议的拓宽,定义了一个map的办法。这样咱们的可调查序列都具有了map的办法,该办法最终回来一个可调查序列。持续点击检查Map(source: self.asObservable(), transform: transform)

RxSwift学习-09-映射操作解析

Map初始化保存了源序列喝咱们map的闭包transform。此刻Map类也是承继于Producer因而具有subscribe的能力。这儿流程和之前剖析一样,在订阅的时分会进入Producer的subscribe办法

RxSwift学习-09-映射操作解析
第一次进入需要进行绑定线程的调度环境,关于调度后面的文章会进行剖析。这儿会走序列的run办法,咱们的Map.run这儿穿入的调查者便是咱们订阅的时分创立的匿名调查者AnonymousObserver,之前文章有剖析过中心逻辑。

RxSwift学习-09-映射操作解析
持续检查

RxSwift学习-09-映射操作解析
正常咱们这儿会履行sink.run,可是这儿游再次经过源可调查序列进行subscribe订阅。这儿会走咱们之前剖析的订阅流程

RxSwift学习-09-映射操作解析
咱们的源序列是经过便捷办法from创立的,因而源可调查序列为ObservableSequence类型

RxSwift学习-09-映射操作解析

因而咱们检查ObservableSequencerun办法

RxSwift学习-09-映射操作解析

经过管子sink关联调查者和序列,observer为咱们保存transform闭包MapSink,检查管子的run办法。

RxSwift学习-09-映射操作解析
可以发现里边有个迭代器,这儿的parent为咱们开始时时分源序列,咱们持续走 forwardOn

RxSwift学习-09-映射操作解析

这儿的observer为mapsink 因而咱们去检查mapSink的on办法

RxSwift学习-09-映射操作解析
这儿会把咱们保存的transform闭包进行调用,之后在进行forwardOn事情。

RxSwift学习-09-映射操作解析
进入父类sink的forwardOn办法,此刻next事情中咱们的元素从Int类型转化成了string类型。此刻咱们的observer为咱们订阅的时分创立的匿名调查者

RxSwift学习-09-映射操作解析
进入序列的onCore办法

RxSwift学习-09-映射操作解析

最终调用匿名调查者的事情闭包

RxSwift学习-09-映射操作解析

2. flatMap

flatMap在Swift的高阶函数是

RxSwift学习-09-映射操作解析
可以看到flatMap是把数组中的数组进行了压平的操作,相当于二维数组转化为一维的数组。 那么在RxSwift中时怎么呢?
flatMap操作符将源Observable的每一个信号应用一个转化办法,将他们转化成Observables。 然后将这些Observables的信号兼并之后再发送出来。

//结构体
struct Player {
  let score: BehaviorRelay<Int>
 
  init(score:Int) {
   
    self.score = BehaviorRelay(value: score)
  }
 
}
        let playerA = Player.init(score: 20)
    let playerB = Player.init(score: 30)
    let player = BehaviorRelay(value: playerA)
   
    player.asObservable()
      .flatMap { (player:Player) ->Observable<Int> in
        player.score.asObservable()
      }.subscribe { (num) in
        print(num)
      } onError: { (error) in
        print(error)
      } onCompleted: {
        print("completed")
      } onDisposed: {
        print("disposed")
      }.disposed(by: disposBag)
   
    playerA.score.accept(40)
    playerB.score.accept(50)
    player.accept(playerB)
    playerB.score.accept(60)
        playerA.score.accept(70)

RxSwift学习-09-映射操作解析
咱们看下它的中心逻辑

RxSwift学习-09-映射操作解析
保存咱们的源序列和咱们flatMap转化的闭包(该闭包回来的是一个可调查序列)。 同样的咱们订阅的时分会进入run办法,因为咱们的FlatMapSink承继于MergeSink因而sink.run会进入mergeSink的run办法中

RxSwift学习-09-映射操作解析

咱们的源序列进行订阅传入的是咱们的FlatMapSink,这儿会走咱们soucre序列的订阅办法,此刻咱们的序列为BehaviorRelay

RxSwift学习-09-映射操作解析

这儿结合你本身源序列的类型,走对应的subscribe办法。咱们的FlatMapSink没有on办法,咱们去它的父类查找。

RxSwift学习-09-映射操作解析

这儿便是中心

RxSwift学习-09-映射操作解析

这儿是调用子类的performMap,也便是FlatMapSink的具体完成回来一个新的可调查序列

RxSwift学习-09-映射操作解析

进行内部订阅

RxSwift学习-09-映射操作解析

之后新的序列进行事情发送

RxSwift学习-09-映射操作解析

进行回调。

3. 总结

关于映射操作Map咱们,这儿就介绍这2种,具体情况还是要自己打断点剖析剖析。

  • map 其实来说便是关于咱们的可调查序列的元素element是数组的时分,咱们经过map保存了一个闭包,当发送信号的时分,会经过一层transform闭包的回调处理咱们的发送元素element,之后进行eventHanlde到订阅者的回调。

RxSwift学习-09-映射操作解析

  • Flatmap 关于FlatMap其实咱们从底层来说也是类似,咱们不再转化元素而是转化了序列源,咱们的序列相当一个中间层,当源序列产生改动,咱们的订阅的内容也随之产生改动,相当于一个转接头

RxSwift学习-09-映射操作解析