美文网首页iOS-swiftRXswiftRxSwift干货
RxSwift文档翻译4-- Transforming Oper

RxSwift文档翻译4-- Transforming Oper

作者: 小白猿 | 来源:发表于2017-06-01 14:22 被阅读124次

    前言

    Transforming Operators 将观察序列的Next事件元素做转换的操作

    Transforming Operators

    • map
      使用一个转换闭包将观察序列的元素进行操作,并返回一个由转后后的事件元素构成的新的序列
    example("map") {
        let disposeBag = DisposeBag()
        Observable.of(1, 2, 3)
            .map { $0 * $0 }
            .subscribe(onNext: { print($0) })
            .disposed(by: disposeBag)
    }
    // 控制台打印的结果:
    --- map example ---
    1
    4
    9
    
    • flatMap and flatMapLatest
      由于对官方的文档实在没有看太懂,所以直接原因谷歌翻译的结果:
      将Observable序列发射的元素转换为Observable序列,并将来自两个Observable序列的发射合并为单个可观测序列。 例如,当您具有自己发出可观测序列的Observable序列,并且您希望能够对来自可观测序列的新的排放作出反应时,这也是有用的。 flatMap和flatMapLatest之间的区别是,flatMapLatest只会从最近的内部Observable序列中发出元素

      根据参考文章中有这样一段解释
      在 Swift 中,我们可以用flatMap过滤掉map之后的nil结果。在 Rx 中,flatMap可以把一个序列转换成一组序列,然后再把这一组序列『拍扁』成一个序列。
      等以后对其有了更深入的理解后再对此节进行修改
    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() }
            .subscribe(onNext: { print($0) })
            .disposed(by: disposeBag)
        
        👦🏻.score.value = 85
        
        player.value = 👧🏼
        
        👦🏻.score.value = 95 
        
        👧🏼.score.value = 100
    
    // 控制台打印的结果:
    --- flatMap and flatMapLatest example ---
    80
    85
    90
    95
    100
    

    如果将 flatMap修改为flatMapLatest,那么 player.value 设置为👧🏼的时候, 👦🏻.score.value 就不会被相应,类似于switchLatest,只会相应最近的元素,此时打印结果为

    // 控制台打印的结果:
    --- flatMap and flatMapLatest example ---
    80
    85
    90
    100
    
    • scan
      ** 设置一个初始种子值,然后在一个累积闭包(scan的参数)中将种子值和观察序列的元素值进行操作,将结果在和序列下一个元素值进行相同的操作,将操作后的值作为序列的新的元素值 **
        Observable.of(10, 100, 1000)
            .scan(1) { aggregateValue, newValue in
                aggregateValue + newValue
            }
            .subscribe(onNext: { print($0) })
            .disposed(by: disposeBag)
    }
    // 控制台打印的结果:
    --- scan example ---
    11
    111
    1111
    

    scan后边的值就是种子,aggregateValue是原始值,newValue是新值,aggregateValue + newValue是具体的操作,过程就是 1 + 10,(1+10)+100, ((1+10)+100) + 1000

    下一节:RxSwift文档翻译5 -- Filtering and Conditional Operators

    相关文章

      网友评论

        本文标题:RxSwift文档翻译4-- Transforming Oper

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