一同养成写作习气!这是我参与「日新计划 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办法。
可以发现里边有个迭代器,这儿的parent为咱们开始时时分源序列,咱们持续走
forwardOn
这儿的observer为mapsink
因而咱们去检查mapSink
的on办法
这儿会把咱们保存的transform
闭包进行调用,之后在进行forwardOn
事情。
进入父类sink的forwardOn
办法,此刻next事情中咱们的元素从Int类型转化成了string类型
。此刻咱们的observer为咱们订阅的时分创立的匿名调查者
进入序列的onCore
办法
最终调用匿名调查者的事情闭包
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
其实咱们从底层来说也是类似,咱们不再转化元素而是转化了序列源,咱们的序列相当一个中间层
,当源序列产生改动,咱们的订阅的内容也随之产生改动,相当于一个转接头
。