一同养成写作习气!这是我参与「日新计划 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
它是可调查序列协议的拓宽,定义了一个map的办法。这样咱们的可调查序列都具有了map的办法,该办法最终回来一个可调查序列。持续点击检查Map(source: self.asObservable(), transform: transform)
Map类初始化保存了源序列喝咱们map的闭包transform。此刻Map类也是承继于Producer因而具有subscribe的能力。这儿流程和之前剖析一样,在订阅的时分会进入Producer的subscribe办法

调度环境,关于调度后面的文章会进行剖析。这儿会走序列的run办法,咱们的Map.run这儿穿入的调查者便是咱们订阅的时分创立的匿名调查者AnonymousObserver,之前文章有剖析过中心逻辑。

sink.run,可是这儿游再次经过源可调查序列进行subscribe订阅。这儿会走咱们之前剖析的订阅流程

from创立的,因而源可调查序列为ObservableSequence类型
因而咱们检查ObservableSequence的run办法
经过管子sink关联调查者和序列,observer为咱们保存transform闭包的MapSink,检查管子的run办法。

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

transform闭包进行调用,之后在进行forwardOn事情。

forwardOn办法,此刻next事情中咱们的元素从Int类型转化成了string类型。此刻咱们的observer为咱们订阅的时分创立的匿名调查者
最终调用匿名调查者的事情闭包
2. flatMap
flatMap在Swift的高阶函数是

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)

flatMap转化的闭包(该闭包回来的是一个可调查序列)。
同样的咱们订阅的时分会进入run办法,因为咱们的FlatMapSink承继于MergeSink因而sink.run会进入mergeSink的run办法中
咱们的源序列进行订阅传入的是咱们的FlatMapSink,这儿会走咱们soucre序列的订阅办法,此刻咱们的序列为BehaviorRelay
这儿结合你本身源序列的类型,走对应的subscribe办法。咱们的FlatMapSink没有on办法,咱们去它的父类查找。
这儿便是中心
这儿是调用子类的performMap,也便是FlatMapSink的具体完成回来一个新的可调查序列
进行内部订阅
之后新的序列进行事情发送
进行回调。
3. 总结
关于映射操作Map咱们,这儿就介绍这2种,具体情况还是要自己打断点剖析剖析。
- map
其实来说便是关于咱们的可调查序列的元素
element是数组的时分,咱们经过map保存了一个闭包,当发送信号的时分,会经过一层transform闭包的回调处理咱们的发送元素element,之后进行eventHanlde到订阅者的回调。
- Flatmap
关于
FlatMap其实咱们从底层来说也是类似,咱们不再转化元素而是转化了序列源,咱们的序列相当一个中间层,当源序列产生改动,咱们的订阅的内容也随之产生改动,相当于一个转接头。



















