★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(let_us_code)
➤博主域名:https://www.zengqiang.org
➤GitHub地址:https://github.com/strengthen/LeetCode
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
强烈推荐!!!试用博主个人App作品!提需求!提建议!
App Store搜索:【Mind Draft】
中国区可直接点击跳转:【Mind Draft】
九、过滤操作符(Filtering Observables)
过滤操作指的是从源 Observable 中选择特定的数据发送。
1,filter
(1)基本介绍
该操作符就是用来过滤掉某些不符合要求的事件。
![[RxSwift教程]9、过滤操作符:filter、take、skip等-冯金伟博客园 [RxSwift教程]9、过滤操作符:filter、take、skip等-冯金伟博客园](https://img.mingle-mangle.com/2023/08/20230821223246447.png)
(2)使用样例
1
2
3
4
5
6
7
8
|
let disposeBag = DisposeBag ()
Observable .of(2, 30, 22, 5, 60, 3, 40 ,9)
. filter {
$0 > 10
}
.subscribe(onNext: { print ($0) })
.disposed(by: disposeBag)
|
运行结果如下:
![[RxSwift教程]9、过滤操作符:filter、take、skip等-冯金伟博客园 [RxSwift教程]9、过滤操作符:filter、take、skip等-冯金伟博客园](https://img.mingle-mangle.com/2023/08/20230822063247371.png)
2,distinctUntilChanged
(1)基本介绍
该操作符用于过滤掉连续重复的事件。
![[RxSwift教程]9、过滤操作符:filter、take、skip等-冯金伟博客园 [RxSwift教程]9、过滤操作符:filter、take、skip等-冯金伟博客园](https://img.mingle-mangle.com/2023/08/20230822063248383.png)
(2)使用样例
1
2
3
4
5
6
|
let disposeBag = DisposeBag ()
Observable .of(1, 2, 3, 1, 1, 4)
.distinctUntilChanged()
.subscribe(onNext: { print ($0) })
.disposed(by: disposeBag)
|
运行结果:
![[RxSwift教程]9、过滤操作符:filter、take、skip等-冯金伟博客园 [RxSwift教程]9、过滤操作符:filter、take、skip等-冯金伟博客园](https://img.mingle-mangle.com/2023/08/20230822063249668.png)
3,single
(1)基本介绍
限制只发送一次事件,或者满足条件的第一个事件。
如果存在有多个事件或者没有事件都会发出一个 error 事件。
如果只有一个事件,则不会发出 error 事件。
![[RxSwift教程]9、过滤操作符:filter、take、skip等-冯金伟博客园 [RxSwift教程]9、过滤操作符:filter、take、skip等-冯金伟博客园](https://img.mingle-mangle.com/2023/08/20230822063250136.png)
(2)使用样例
1
2
3
4
5
6
7
8
9
10
11
|
let disposeBag = DisposeBag ()
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)
|
运行结果:
![[RxSwift教程]9、过滤操作符:filter、take、skip等-冯金伟博客园 [RxSwift教程]9、过滤操作符:filter、take、skip等-冯金伟博客园](https://img.mingle-mangle.com/2023/08/20230822063251921.png)
4,elementAt
(1)基本介绍
该方法实现只处理在指定位置的事件。
![[RxSwift教程]9、过滤操作符:filter、take、skip等-冯金伟博客园 [RxSwift教程]9、过滤操作符:filter、take、skip等-冯金伟博客园](https://img.mingle-mangle.com/2023/08/20230822063252664.png)
(2)使用样例
1
2
3
4
5
6
|
let disposeBag = DisposeBag ()
Observable .of(1, 2, 3, 4)
.elementAt(2)
.subscribe(onNext: { print ($0) })
.disposed(by: disposeBag)
|
运行结果如下:
![[RxSwift教程]9、过滤操作符:filter、take、skip等-冯金伟博客园 [RxSwift教程]9、过滤操作符:filter、take、skip等-冯金伟博客园](https://img.mingle-mangle.com/2023/08/20230822063253602.png)
5,ignoreElements
(1)基本介绍
该操作符可以忽略掉所有的元素,只发出 error 或 completed 事件。
如果我们并不关心 Observable 的任何元素,只想知道 Observable 在什么时候终止,那就可以使用 ignoreElements 操作符。
![[RxSwift教程]9、过滤操作符:filter、take、skip等-冯金伟博客园 [RxSwift教程]9、过滤操作符:filter、take、skip等-冯金伟博客园](https://img.mingle-mangle.com/2023/08/20230822063254525.png)
(2)使用样例
1
2
3
4
5
6
7
8
|
let disposeBag = DisposeBag ()
Observable .of(1, 2, 3, 4)
.ignoreElements()
.subscribe{
print ($0)
}
.disposed(by: disposeBag)
|
运行结果如下:
![[RxSwift教程]9、过滤操作符:filter、take、skip等-冯金伟博客园 [RxSwift教程]9、过滤操作符:filter、take、skip等-冯金伟博客园](https://img.mingle-mangle.com/2023/08/20230822063255488.png)
(1)基本介绍
该方法实现仅发送 Observable 序列中的前 n 个事件,在满足数量之后会自动 .completed。
![[RxSwift教程]9、过滤操作符:filter、take、skip等-冯金伟博客园 [RxSwift教程]9、过滤操作符:filter、take、skip等-冯金伟博客园](https://img.mingle-mangle.com/2023/08/20230822063256800.png)
(2)使用样例
1
2
3
4
5
6
|
let disposeBag = DisposeBag ()
Observable .of(1, 2, 3, 4)
.take(2)
.subscribe(onNext: { print ($0) })
.disposed(by: disposeBag)
|
运行结果如下:
![[RxSwift教程]9、过滤操作符:filter、take、skip等-冯金伟博客园 [RxSwift教程]9、过滤操作符:filter、take、skip等-冯金伟博客园](https://img.mingle-mangle.com/2023/08/20230822063257575.png)
7,takeLast
(1)基本介绍
该方法实现仅发送 Observable 序列中的后 n 个事件。
![[RxSwift教程]9、过滤操作符:filter、take、skip等-冯金伟博客园 [RxSwift教程]9、过滤操作符:filter、take、skip等-冯金伟博客园](https://img.mingle-mangle.com/2023/08/20230822063258999.png)
(2)使用样例
1
2
3
4
5
6
|
let disposeBag = DisposeBag ()
Observable .of(1, 2, 3, 4)
.takeLast(1)
.subscribe(onNext: { print ($0) })
.disposed(by: disposeBag)
|
运行结果如下:
![[RxSwift教程]9、过滤操作符:filter、take、skip等-冯金伟博客园 [RxSwift教程]9、过滤操作符:filter、take、skip等-冯金伟博客园](https://img.mingle-mangle.com/2023/08/20230822063259220.png)
8,skip
(1)基本介绍
该方法用于跳过源 Observable 序列发出的前 n 个事件。
![[RxSwift教程]9、过滤操作符:filter、take、skip等-冯金伟博客园 [RxSwift教程]9、过滤操作符:filter、take、skip等-冯金伟博客园](https://img.mingle-mangle.com/2023/08/20230822063300321.png)
(2)使用样例
1
2
3
4
5
6
|
let disposeBag = DisposeBag()
Observable. of (1, 2, 3, 4)
.skip(2)
.subscribe(onNext: { print($0) })
.disposed( by : disposeBag)
|
运行结果如下:
![[RxSwift教程]9、过滤操作符:filter、take、skip等-冯金伟博客园 [RxSwift教程]9、过滤操作符:filter、take、skip等-冯金伟博客园](https://img.mingle-mangle.com/2023/08/20230822063302610.png)
9,Sample
(1)基本介绍
Sample 除了订阅源 Observable 外,还可以监视另外一个 Observable, 即 notifier 。
每当收到 notifier 事件,就会从源序列取一个最新的事件并发送。而如果两次 notifier 事件之间没有源序列的事件,则不发送值。
![[RxSwift教程]9、过滤操作符:filter、take、skip等-冯金伟博客园 [RxSwift教程]9、过滤操作符:filter、take、skip等-冯金伟博客园](https://img.mingle-mangle.com/2023/08/20230822063302904.png)
(2)使用样例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
let disposeBag = DisposeBag ()
let source = PublishSubject < Int >()
let notifier = PublishSubject < String >()
source
.sample(notifier)
.subscribe(onNext: { print ($0) })
.disposed(by: disposeBag)
source.onNext(1)
notifier.onNext( "A" )
source.onNext(2)
notifier.onNext( "B" )
notifier.onNext( "C" )
source.onNext(3)
source.onNext(4)
notifier.onNext( "D" )
source.onNext(5)
notifier.onCompleted()
|
运行结果如下:
![[RxSwift教程]9、过滤操作符:filter、take、skip等-冯金伟博客园 [RxSwift教程]9、过滤操作符:filter、take、skip等-冯金伟博客园](https://img.mingle-mangle.com/2023/08/20230822063303300.png)
10,debounce
(1)基本介绍
debounce 操作符可以用来过滤掉高频产生的元素,它只会发出这种元素:该元素产生后,一段时间内没有新元素产生。
换句话说就是,队列中的元素如果和下一个元素的间隔小于了指定的时间间隔,那么这个元素将被过滤掉。
debounce 常用在用户输入的时候,不需要每个字母敲进去都发送一个事件,而是稍等一下取最后一个事件。
![[RxSwift教程]9、过滤操作符:filter、take、skip等-冯金伟博客园 [RxSwift教程]9、过滤操作符:filter、take、skip等-冯金伟博客园](https://img.mingle-mangle.com/2023/08/20230822063305961.png)
(2)使用样例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
import UIKit
import RxSwift
import RxCocoa
class ViewController : UIViewController {
let disposeBag = DisposeBag ()
override func viewDidLoad() {
let times = [
[ "value" : 1, "time" : 0.1 ],
[ "value" : 2, "time" : 1.1 ],
[ "value" : 3, "time" : 1.2 ],
[ "value" : 4, "time" : 1.2 ],
[ "value" : 5, "time" : 1.4 ],
[ "value" : 6, "time" : 2.1 ]
]
Observable .from(times)
.flatMap { item in
return Observable .of( Int (item[ "value" ]!))
.delaySubscription( Double (item[ "time" ]!),
scheduler: MainScheduler .instance)
}
.debounce(0.5, scheduler: MainScheduler .instance)
.subscribe(onNext: { print ($0) })
.disposed(by: disposeBag)
}
}
|
运行结果如下:
![[RxSwift教程]9、过滤操作符:filter、take、skip等-冯金伟博客园 [RxSwift教程]9、过滤操作符:filter、take、skip等-冯金伟博客园](https://img.mingle-mangle.com/2023/08/20230822063306555.png)