美文网首页
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