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
}
let Mac = Student(score: Variable (90))
let Win = Student(score: Variable (70))

这个时候 Mac 和 Win 就是两个互相独立的 Observable ,我们创建一个 PublishSubject 来订阅

let student = PublishSubject()

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
然后我们再来看后半段,为了方便理解我们在两次改变 Mac 的成绩的中间 将 Win 加入进去。执行一次可以看到 一次打印 90 - 95 - 70 -98。
首先,flatMap会把它原序列中的每个事件,都变换成一个Observable。因此,再加入了 Win 之后,flatMap一共变换出了两个Observable,这就是 flatMap 定义的前半部分。
其次,当我们在把 win 加入到序列中的时候,flatMap 会把 Mac 中的事件的值和 Win 中的事件的值合并到一起,变成一个 Observable ,这种把两个 Observable 变成一个 Observable 到过程就是 flatMap 定义中的后半段。

如果我们把上面的 flatMap 换成 map,就会看到 打印

RxSwift.BehaviorSubject

map 返回的是原来的序列,如果要想
看到序列中事件的值,则需要使用 merge 合并成一个新序列

  • map函数只能返回原来的那一个序列,里面的参数的返回值被当做原来序列中所对应的元素。
  • flatMap函数返回的是一个新的序列,将原来元素进行了处理,返回这些处理后的元素组成的新序列
  • map函数 + 合并函数 = flatMap函数

你可能感兴趣的:(flatMap 与 Map)