RxSwift使用技巧之过滤操作详解

2020-01-08 23:46:13王冬梅

前言

在前面的基础之上接下来我会介绍一些常用的函数和实用技巧。首先,本文将会介绍那些用于对 next 事件进行过滤的操作。这些过滤操作类似于 Swift 标准库中的 filter 操作。它能在我们开始真正进行业务处理前先把那些不符合条件的过滤掉,而且这种函数式编程的范式也能开阔我们的思维。

Ignore 过滤

RxSwift 中最简单直接的过滤操作就是 ignoreElements 了。该操作会屏蔽所有的 next 事件,只会将注意力放在 error 和 completed 事件上。如下图所示,在整个生命周期中可观察对象的所有 next 都被过滤。

rxswift,rxswift是什么,教程

示例代码:


let strikes = PublishSubject<String>()
 
let disposeBag = DisposeBag()

strikes
 .ignoreElements()
 .subscribe { _ in
 print("You're out!")
 }
 .addDisposableTo(disposeBag)
 
strikes.onNext("X")
strikes.onNext("X")
strikes.onNext("X")
 
strikes.onCompleted()

/* 打印结果
You're out!
*/

不过相比于残暴的全部过滤,有时候我们可能只是需要过滤某些特定的事件。例如,我们可以通过 elementAt 对特定索引号 next 进行过滤。下图演示了只响应第二个 next 事件的 elementAt 操作。

rxswift,rxswift是什么,教程

与之相应的代码为:


let strikes = PublishSubject<String>()
 
let disposeBag = DisposeBag()
 
strikes
 .elementAt(2)
 .subscribe(onNext: { str in
 print(str)
 })
 .addDisposableTo(disposeBag)
 
strikes.onNext("1")
strikes.onNext("2")
strikes.onNext("3")
 
strikes.onCompleted()

/* 打印结果
3
*/

上面两个操作最后针对的 next 事件最多只会有一个,但是大多数时候我们其实需要筛选出一组符合条件的 next 事件。下图演示的就是使用 filter 筛选数据小于 3 的操作。

rxswift,rxswift是什么,教程

图示对应代码如下:


let strikes = PublishSubject<Int>()
 
let disposeBag = DisposeBag()
 
strikes
 .filter{ $0 < 3 }
 .subscribe(onNext: { num in
 print("(num)")
 })
 .addDisposableTo(disposeBag)
 
strikes.onNext(1)
strikes.onNext(2)
strikes.onNext(3)
strikes.onNext(4)
strikes.onNext(5)
 
strikes.onCompleted()

/* 打印结果
1
2
*/

Skip 过滤

除了忽略操作外,另一个常见的过滤就是跳过操作了。在所有的跳过操作中,最简单的就属 skip 了。通过设定参数,我们就能和简单实现跳过指定个数的事件。例如,下图久演示跳过前两个事件的操作。