RxSwift笔记 - Filtering Observables

57 篇文章 1 订阅
23 篇文章 0 订阅


Debounce

过滤掉高频产生的元素

debounce 常用在用户输入的时候,不需要每个字母敲进去都发送一个事件,而是稍等一下取最后一个事件。

屏幕快照 2018-05-27 下午9.30.16.png

Observable.range(start: 0, count: 10).debounce(0.1, scheduler: MainScheduler.instance).subscribe(onNext: {
        print($0)
    }).disposed(by: disposeBag)

Single

限制 Observable 只有一个元素,否出发出一个 error 事件

single 操作符将限制 Observable 只产生一个元素。如果 Observable 只有一个元素,它将镜像这个 Observable 。如果 Observable 没有元素或者元素数量大于一,它将产生一个 error 事件

single.png

Observable.of(1, 2, 3, 4)
    .single{ $0 == 2 }
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)

Observable.of("A", "B", "C", "D")
    .single()
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)

/*
2
A
Unhandled error happend: Sequence contains more than one element. subscription called from:
*/

DistinctUntilChanged

阻止 Observable 发出相同的元素

Distinct的过滤规则是:只允许还没有发射过的数据项通过

屏幕快照 2018-05-27 下午9.31.32.png

Observable<Int>.of(1, 3, 5, 6, 6, 6, 8, 7, 8, 8, 8, 9).distinctUntilChanged().subscribe(onNext: {
        print($0)
    }).disposed(by: disposeBag)

/*
 1
 3
 5
 6
 8
 7
 8
 9
 */

ElementAt

只发出 Observable 中的第 n 个元素

屏幕快照 2018-05-27 下午9.32.33.png

Observable.of("I", "M", "A", "Z", "Y", "E", "R")
    .elementAt(1)
    .subscribe(onNext: {
    print($0)
}).disposed(by: disposeBag)

/*
M
 */

Filter

仅仅发出 Observable 中通过判定的元素

屏幕快照 2018-05-27 下午9.33.09.png

Observable.of(2, 30, 22, 5, 60, 1, 6)
    .filter({ $0 > 10 })
    .subscribe(onNext: {
    print($0)
}).disposed(by: disposeBag)

/*
 30
 22
 60
 */

IgnoreElements

忽略掉所有的元素,只发出 error 或 completed 事件

如果我们并不关心 Observable 的任何元素,只想知道 Observable 在什么时候终止,那就可以使用 ignoreElements 操作符

ignoreElements.c.png

Observable.of("A", "B", "C", "D", "E", "F", "G").ignoreElements().subscribe(onCompleted: {
    print("conpleted")
}) { (error) in
    print(error)
}.disposed(by: disposeBag)

Sample

不定期的对 Observable 取样

sample 操作符将不定期的对源 Observable 进行取样操作。通过第二个 Observable 来控制取样时机。一旦第二个 Observable 发出一个元素,就从源 Observable 中取出最后产生的元素。

屏幕快照 2018-05-27 下午9.36.02.png

let source = PublishSubject<Int>()
let notify = PublishSubject<String>()

source.sample(notify).subscribe(onNext: {
    print($0)
}).disposed(by: disposeBag)
source.onNext(1)

notify.onNext("A")

source.onNext(2)

notify.onNext("B")
notify.onNext("C")

source.onNext(3)
source.onNext(4)

notify.onNext("D")

source.onNext(5)

notify.onCompleted()

/*
 1
 2
 4
 5
 */

Skip

跳过 Observable 中头 n 个元素

屏幕快照 2018-05-27 下午9.37.43.png

Observable.of("1", "2", "3", "4", "5", "6", "7")
    .skip(3)
    .subscribe(onNext: {
    print($0)
}).disposed(by: disposeBag)

/*
4
5
6
7
*/

Take

仅仅从 Observable 中发出头 n 个元素

屏幕快照 2018-05-27 下午9.40.04.png

Observable.of("A", "B", "C", "D", "E", "F", "G").take(3)
    .subscribe(onNext: {
    print($0)
}).disposed(by: disposeBag)

/*
A
B
C
 */

TakeLast

仅仅从 Observable 中发出尾部 n 个元素

屏幕快照 2018-05-27 下午9.40.31.png

Observable.of("1", "2", "3", "4", "5", "6", "7").takeLast(3)
    .subscribe(onNext: {
        print($0)
    }).disposed(by: disposeBag)

/*
5
6
7
 */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值