flatMap 与 Map
首先看看官方对于 flatMap
的定义:Transform the items emitted by an Observable into Observables, then flatten the emissions from those into a single Observable.
光看到这句话不好理解,我们拆开来看
- 把序列中的事件变成新的 Observable
- 合成所有转换过来的序列
首先定义一个结构体,生成两个对象
struct Student {
var score: Variable<Int>
}
let Mac = Student(score: Variable (90))
let Win = Student(score: Variable (70))
这个时候 Mac
和 Win
就是两个互相独立的 Observable
,我们创建一个 PublishSubject<Student>
来订阅
let student = PublishSubject<Student>()
players.asObservable()
.flatMap {
$0.score.asObservable()
}
.subscribe(onNext: {
print($0)
})
.addDisposableTo(bag)
然后,将 Mac 加入序列
players.onNext(Mac)
执行一下就能看到 Mac 的分数为 90,这个时候再去改变 Mac 的分数:
Mac.score.value = 95
Mac.score.value = 98
再执行一次可以看到,依次打印 90 - 95 -98
Mac
是序列中的事件,我们通过 flatMap
将它变成了 Observable<Int>
。
然后我们再来看后半段,为了方便理解我们在两次改变 Mac
的成绩的中间将 Win
加入进去。执行一次可以看到 依次打印 90 - 95 - 70 -98
。
首先,flatMap
会把它原序列中的每个事件,都变换成一个 Observable
。因此,再加入了 Win
之后,flatMap
一共变换出了两个 Observable<Int>
,这就是 flatMap
定义的前半部分。
其次,当我们在把 Win
加入到序列中的时候,flatMap
会把 Mac
中的事件的值和 Win
中的事件的值合并到一起,变成一个 Observable<Int>
,这种把两个 Observable<Int>
变成一个 Observable<Int>
到过程就是 flatMap
定义中的后半段。
如果我们把上面的 flatMap 换成 map,就会看到 打印
RxSwift.BehaviorSubject<Swift.Int>
map
返回的是原来的序列,如果要想 看到序列中事件的值,则需要使用 merge
合并成一个新序列
map
函数只能返回原来的那一个序列,里面的参数的返回值被当做原来序列中所对应的元素。flatMap
函数返回的是一个新的序列,将原来元素进行了处理,返回这些处理后的元素组成的新序列map
函数 + 合并函数 =flatMap
函数