美文网首页
RxSwift学习笔记(3) -控制信号

RxSwift学习笔记(3) -控制信号

作者: Dev端 | 来源:发表于2016-05-19 23:41 被阅读1370次

    前两天基本上学了RxSwift的一些基本概念, 信号构成和组合, Rx的基本思想. 此文来看一发给信号添加中间操作的一些API.

    Map

    Observable.of(1, 2, 3)
        .map { $0 * $0 }
        .subscribeNext { print($0) }
        .addDisposableTo(disposeBag)
    

    提交到subscriber手中之前, 对event的值做一些额外操作.

    FlatMap & flatMapLatest

    和之前的switchLatest()一样, flatMap, flatMapLatest 让观察者观察的东西变成动态的了. 后者是只观察最后一个值.

    let 👦🏻 = Player(score: Variable(80))
    let 👧🏼 = Player(score: Variable(90))
    
    let player = Variable(👦🏻)
    // Variable的构成: value.
    
    player.asObservable()
        .flatMap { $0.score.asObservable() } // Change flatMap to flatMapLatest and observe change in printed output
    

    Scan

    Observable.of(10, 100, 1000)
        .scan(1) { aggregateValue, newValue in
            aggregateValue + newValue
        }
    

    Scan 类似于Swift原生带的 reduce 方法, 逐层操作, aggregateValue作为临时变量, 记录上一次返回的值, scan带的参数为aggregateValue的初始值. 和reduce的区别在于, 每一次的返回值都会作为Observable的value来sendNext.

    Filter

    filter和原生Array.filter的操作一样:

    Observable.of(
        "🐱", "🐰", "🐶",
        "🐸", "🐱", "🐰",
        "🐹", "🐸", "🐱")
        .filter {
            $0 == "🐱"
        }
    

    distinctUntilChanged

    这个操作顾名思义,"前后信号传递的值一致则主动忽略重复".

    Observable.of("🐱", "🐷", "🐱", "🐱", "🐱", "🐵", "🐱")
        .distinctUntilChanged()
    

    这个基本是之前提到的latest系列API的另一种实现手段吧.

    elementAt

    提取subscribe之后第n个信号:

    
    Observable.of("🐱", "🐰", "🐶", "🐸", "🐷", "🐵")
        .elementAt(3)
    

    太多了, 其他的API, 我就简单抄一下吧:

    single()只向下传第一个信号
    single { $0 == "1" } 只向下传满足条件的第一个信号
    take(3) 向下传前3个信号
    takeLast(3)向下传最后3个信号
    takeWhile { $0 < 4 }向下传从头开始数满足条件的信号, 一旦不满足, 后面的忽略.
    skip(2) 忽略前2个
    skipWhile { $0 < 4 } 忽略从头开始数满足条件的, 一旦条件不满足, 下面的都不忽略.
    skipWhileWithIndex { element, index in index < 3} index小于3的忽略
    skipUntil(referenceSequence)一直忽略, 知道referenceSequence发送信号.

    Skip和Take系列方法主要就是在Filter的基础上加了"从头/从尾"开始算的条件, 感觉一般来说filter就足够了吧.

    深度转换

    .toArray()转成Array输出
    .reduce(1, accumulator: +) 合并且批处理

    concat()是让variable变化value的时候, 在前一个Observable发送compete之后, 才让后一个Observable变成可用的.

    variable.asObservable()
        .concat()
    

    在Rx的这个网站上, 官方演示了所有控制信号的API的图形化演示:
    http://rxmarbles.com/

    Referece:
    https://github.com/ReactiveX/RxSwift/tree/master/Rx.playground
    https://github.com/ReactiveX/RxSwift/tree/master/Documentation

    相关文章

      网友评论

          本文标题:RxSwift学习笔记(3) -控制信号

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