美文网首页
六、转变操作-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