六、转变操作-Transforming Operators(Rx.playground翻译)

注意:使用本例中的代码首先应该导入头文件,代码如下:

import RxSwift

Transforming Operators

这类操作可以转换通过一个Observable序列发散的 Next 事件中的元素。

map

应用一个转换闭包于通过一个Observable序列发散的元素�,并且返回一个新的转换过元素的Observable序列。了解更多

example("map") {
    let disposeBag = DisposeBag()
    Observable.of(1, 2, 3)
        .map { $0 * $0 }
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
}

Debug Area 输出:
--- map example ---
1
4
9


flatMap 和 flatMapLatest

将一个Observable序列发散出的元素转换成多个Observable序列,并且合并这些发散元素作为一个单独的Observable序列。有时候这是非常有用的,比如,当你有一个Observable序列本身能自己发散Observable序列,而且你希望能够响应新的发散和Observable序列。flatMapflatMapLatest不同的是,flatMapLatest只会发出最新的Observable序列内部的元素。了解更多

image

example("flatMap and flatMapLatest") {
    let disposeBag = DisposeBag()

    struct Player {
        var score: Variable<Int>
    }

    let 👦 = Player(score: Variable(80))
    let 👧 = Player(score: Variable(90))

    let player = Variable(👦)

    player.asObservable()
        .flatMap { $0.score.asObservable() }  // 尝试把 flatMap 换成 flatMapLatest 并且观察输出。
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)

    👦.score.value = 85
    
    player.value = 👧

    👦.score.value = 95  // 当使用 flatMap 时将被打印,但是使用 flatMapLatest 时将不会被打印。

    👧.score.value = 100
}

Debug Area 输出:
--- flatMap and flatMapLatest example ---
80
85
90
95
100

  • 在这个例子中 ,使用 flatMap 可能产生意想不到的后果。在把👧赋值给player.value之后,👧.score将开始发散元素,但是在前面Observable序列之内也将一直发散元素。通过把flatMap改变成flatMapLatest,只有最新的Observable序列之内将发散元素,也就是说,设置 👦.score.value = 95是没有意义的。
  • flatMapLatest实际上是mapswitchLatest操作的组合。

scan

首先使用一个值进行初始化,然后把Observable序列发散的每个元素应用于一个累加器闭包中,并返回每个中间结果作为一个含有单个元素的Observable序列。�了解更多

example("scan") {
    let disposeBag = DisposeBag()

    Observable.of(10, 100, 1000)
        .scan(1) { aggregateValue, newValue in
            aggregateValue + newValue
        }
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
}

Debug Area 输出:
--- scan example ---
11
111
1111


下一篇: 七、��过滤和条件操作-Filtering and Conditional Operators(Rx.playground翻译)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容