美文网首页
六、转变操作-Transforming Operators(R

六、转变操作-Transforming Operators(R

作者: 七夕猪 | 来源:发表于2016-06-24 15:54 被阅读84次

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

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翻译)

相关文章

网友评论

      本文标题:六、转变操作-Transforming Operators(R

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