为有牺牲多壮志,敢教日月换新天。

[RxSwift教程]9、过滤操作符:filter、take、skip等

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(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)基本介绍
  • 该操作符就是用来过滤掉某些不符合要求的事件。
原文:Swift - RxSwift的使用详解9(过滤操作符:filter、take、skip等)
(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)

运行结果如下:

原文:Swift - RxSwift的使用详解9(过滤操作符:filter、take、skip等)

2,distinctUntilChanged

(1)基本介绍
  • 该操作符用于过滤掉连续重复的事件。
原文:Swift - RxSwift的使用详解9(过滤操作符:filter、take、skip等)
(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)

运行结果:

原文:Swift - RxSwift的使用详解9(过滤操作符:filter、take、skip等)

3,single

(1)基本介绍
  • 限制只发送一次事件,或者满足条件的第一个事件。
  • 如果存在有多个事件或者没有事件都会发出一个 error 事件。
  • 如果只有一个事件,则不会发出 error 事件。
原文:Swift - RxSwift的使用详解9(过滤操作符:filter、take、skip等)
(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)

运行结果:

原文:Swift - RxSwift的使用详解9(过滤操作符:filter、take、skip等)

4,elementAt

(1)基本介绍
  • 该方法实现只处理在指定位置的事件。
原文:Swift - RxSwift的使用详解9(过滤操作符:filter、take、skip等)
(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)
运行结果如下:
原文:Swift - RxSwift的使用详解9(过滤操作符:filter、take、skip等)

5,ignoreElements

(1)基本介绍
  • 该操作符可以忽略掉所有的元素,只发出 error 或 completed 事件。
  • 如果我们并不关心 Observable 的任何元素,只想知道 Observable 在什么时候终止,那就可以使用 ignoreElements 操作符。
原文:Swift - RxSwift的使用详解9(过滤操作符:filter、take、skip等)
(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)
运行结果如下:
原文:Swift - RxSwift的使用详解9(过滤操作符:filter、take、skip等)

6,take

(1)基本介绍
  • 该方法实现仅发送 Observable 序列中的前 n 个事件,在满足数量之后会自动 .completed。
原文:Swift - RxSwift的使用详解9(过滤操作符:filter、take、skip等)
(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)
运行结果如下:
原文:Swift - RxSwift的使用详解9(过滤操作符:filter、take、skip等)

7,takeLast

(1)基本介绍
  • 该方法实现仅发送 Observable 序列中的后 n 个事件。
原文:Swift - RxSwift的使用详解9(过滤操作符:filter、take、skip等)
(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)
运行结果如下:
原文:Swift - RxSwift的使用详解9(过滤操作符:filter、take、skip等)

8,skip

(1)基本介绍
  • 该方法用于跳过源 Observable 序列发出的前 n 个事件。
原文:Swift - RxSwift的使用详解9(过滤操作符:filter、take、skip等)
(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)
运行结果如下:
原文:Swift - RxSwift的使用详解9(过滤操作符:filter、take、skip等)

9,Sample

(1)基本介绍
  • Sample 除了订阅源 Observable 外,还可以监视另外一个 Observable, 即 notifier 。
  • 每当收到 notifier 事件,就会从源序列取一个最新的事件并发送。而如果两次 notifier 事件之间没有源序列的事件,则不发送值。
原文:Swift - RxSwift的使用详解9(过滤操作符:filter、take、skip等)
(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()
运行结果如下:
原文:Swift - RxSwift的使用详解9(过滤操作符:filter、take、skip等)

10,debounce

(1)基本介绍
  • debounce 操作符可以用来过滤掉高频产生的元素,它只会发出这种元素:该元素产生后,一段时间内没有新元素产生。
  • 换句话说就是,队列中的元素如果和下一个元素的间隔小于了指定的时间间隔,那么这个元素将被过滤掉。
  • debounce 常用在用户输入的时候,不需要每个字母敲进去都发送一个事件,而是稍等一下取最后一个事件。
原文:Swift - RxSwift的使用详解9(过滤操作符:filter、take、skip等)
(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 ViewControllerUIViewController {
     
    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 序列并订阅
        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) //只发出与下一个间隔超过0.5秒的元素
            .subscribe(onNext: { print($0) })
            .disposed(by: disposeBag)
    }
}
运行结果如下:
原文:Swift - RxSwift的使用详解9(过滤操作符:filter、take、skip等)
 
posted @ 2020-09-15 15:44  为敢技术  阅读(439)  评论(0编辑  收藏  举报