Debounce
过滤掉高频产生的元素
debounce 常用在用户输入的时候,不需要每个字母敲进去都发送一个事件,而是稍等一下取最后一个事件。
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 事件
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的过滤规则是:只允许还没有发射过的数据项通过
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 个元素
Observable.of("I", "M", "A", "Z", "Y", "E", "R")
.elementAt(1)
.subscribe(onNext: {
print($0)
}).disposed(by: disposeBag)
/*
M
*/
Filter
仅仅发出 Observable 中通过判定的元素
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 操作符
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 中取出最后产生的元素。
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 个元素
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 个元素
Observable.of("A", "B", "C", "D", "E", "F", "G").take(3)
.subscribe(onNext: {
print($0)
}).disposed(by: disposeBag)
/*
A
B
C
*/
TakeLast
仅仅从 Observable 中发出尾部 n 个元素
Observable.of("1", "2", "3", "4", "5", "6", "7").takeLast(3)
.subscribe(onNext: {
print($0)
}).disposed(by: disposeBag)
/*
5
6
7
*/