RxSwift干货swiftRxSwift实战

flatMap 与 Map

2018-03-02  本文已影响196人  kled_net

首先看看官方对于 flatMap 的定义:Transform the items emitted by an Observable into Observables, then flatten the emissions from those into a single 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 合并成一个新序列

上一篇下一篇

猜你喜欢

热点阅读