map操作符将源
Observable
的每个元素应用你提供的转换方法,然后返回含有转换结果的Observable
—— 新的可观察序列。
示例:
let ob = Observable.of(1, 2, 3, 4)
ob.map { (num) -> Int in
return num + 2
}
.subscribe(onNext: { (num) in
print("num: \(num)")
})
.disposed(by: disposeBag)
打印结果:
num: 3
num: 4
num: 5
num: 6
map源码分析
点击 map
函数进入源码来到这里。


map
函数。其中调用了
self.asObservable().composeMap(transform)
在之前的文章中已经分析过了,asObservable()
的作用是将返回 self
并转换为 Observable
对象。因此,我们在查找 composeMap
函数的源码时,应该找

Observable
中的 composeMap
函数。我们继续查看源码。

_map
,继续查看。

就会发现,最终是初始化了一个继承自 Producer
的 Map
对象的实例。并在初始化时保存了,源序列 source
和 转换方法 transform
。
上面的分析就是调用 map
函数的过程。而且知道 Map
对象是继承自 Producer
对象的。
看过RxSwift核心逻辑分析的小伙伴应该知道可观察序列在 subscribe
时,最后会调用子类的 run
函数。那我们来分析 Map
对象的 run
函数。
override func run<O: ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == ResultType {
let sink = MapSink(transform: self._transform, observer: observer, cancel: cancel)
let subscription = self._source.subscribe(sink)
return (sink: sink, subscription: subscription)
}
在 run
函数中,初始化了 MapSink
对象,并在其中保存了转换方法和观察者。具体分析可类比RxSwift核心逻辑分析中的 AnonymousObservableSink
。
之后,执行了 self._source.subscribe(sink)
这是对原序列进行了订阅!!!因为,发送原始信号的肯定是源序列,没有其他了。
因此最终,会来到 sink
的 on
函数。所以我们重点分析 MapSink
的 on
函数。

let mappedElement = try self._transform(element)
。对信号使用转换方法进行转换包装,变成一个新的信号,再返回给观察者,完成转换过程。
以上则是 map
函数的转换过程。若有不足之处,还请小伙伴们评论指正。
网友评论