首先看看官方对于 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函数
网友评论