flatMap 与 Map

作者: kled_net | 来源:发表于2018-03-02 18:07 被阅读196次

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

相关文章

网友评论

    本文标题:flatMap 与 Map

    本文链接:https://www.haomeiwen.com/subject/czaaxftx.html