RxSwift官方使用示例之<过滤及条件操作符>

avatar
iOS 开发工程师 @抖音视界有限公司

本文是示例主要来自于官方的实例代码,可从这里下载 ,实例代码稍有改动。其中的图片来自于reactivex.io/

本文主要的作用是查看实例代码并查看对应实例代码的效果,不需要运行项目

操作符目录

debug 操作符会打印所有的 subscriptions, events, disposals

filter

只发出 Observable 序列中满足指定条件的元素

image.png

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

打印

30
22
60

distinctUntilChanged

抑制由 Observable 序列发出的连续重复元素

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

打印

1
2
1
3

elementAt

只发射 Observable 序列指定索引处的元素

image.png

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

打印

3

single

仅发射 Observable 序列发射的第一个元素(或第一个满足条件的元素)。 如果 Observable 序列没有发出恰好一个元素,则会抛出错误

let disposeBag = DisposeBag()
        
Observable.of("🐱", "🐰", "🐶", "🐸", "🐷", "🐵")
    .single()
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)

打印

🐱
Unhandled error happened: Sequence contains more than one element.

此时会有错误信息打印,如果想处理该错误信息,可以加上 onError:,如下

let disposeBag = DisposeBag()
                
Observable.of("🐱", "🐰", "🐶", "🐸", "🐷", "🐵")
    .single()
    .subscribe(onNext: { print($0) }, onError: { print("出错啦:", $0) } )
    .disposed(by: disposeBag)

打印

🐱
出错啦: Sequence contains more than one element.

此外,single 还可以加上条件判断

let disposeBag = DisposeBag()
        
Observable.of("🐱", "🐰", "🐶", "🐸", "🐷", "🐵")
    .single { $0 == "🐸" }
    .subscribe { print($0) }
    .disposed(by: disposeBag)

Observable.of("🐱", "🐰", "🐶", "🐱", "🐰", "🐶")
    .single { $0 == "🐰" }
    .subscribe { print($0) }
    .disposed(by: disposeBag)

Observable.of("🐱", "🐰", "🐶", "🐸", "🐷", "🐵")
    .single { $0 == "🔵" }
    .subscribe { print($0) }
    .disposed(by: disposeBag)

打印

next(🐸)
completed
next(🐰)
error(Sequence contains more than one element.)
error(Sequence doesn't contain any elements.)

从打印可以看出,第一个打印正常,输出一个结果之后立即completed;第二个打印异常,因为有2个🐰,所以抛出异常 error(Sequence contains more than one element.);第三个也异常,因为序列中没有🔵,抛出异常error(Sequence doesn't contain any elements.)

take

仅从 Observable 序列的开头发出指定数量的元素

image.png

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

打印

1
2

takeLast

仅从 Observable 序列的末尾发出指定数量的元素

image.png

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

打印

4

takeWhile

从 Observable 序列的开头发出满足条件的元素 image.png

let disposeBag = DisposeBag()
            
Observable.of(1, 2, 3, 4, 5, 6)
    .take(while: { $0 < 4 } )
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)

打印

1
2
3

takeUntil

从源 Observable 序列中发出元素,直到引用 Observable 序列发出元素

image.png

let disposeBag = DisposeBag()
        
let sourceSequence = PublishSubject<String>()
let referenceSequence = PublishSubject<String>()

sourceSequence
    .take(until: referenceSequence)
    .subscribe { print($0) }
    .disposed(by: disposeBag)

sourceSequence.onNext("1")
sourceSequence.onNext("2")
sourceSequence.onNext("3")
sourceSequence.onNext("3")
sourceSequence.onNext("4")
sourceSequence.onNext("5")

referenceSequence.onNext("0")

sourceSequence.onNext("6")
sourceSequence.onNext("7")
sourceSequence.onNext("8")

referenceSequence.onNext("0")

sourceSequence.onNext("9")

打印

next(1)
next(2)
next(3)
next(3)
next(4)
next(5)
completed

skip

Observable 序列的开头跳过发射指定数量的元素 image.png

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

打印

next(3)
next(4)
completed

skipWhile

Observable 序列的开头跳过发射满足条件的元素

image.png

let disposeBag = DisposeBag()

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

打印

4
5
6

skipWhileWithIndex

Observable 序列的开头跳过发射满足条件的元素

这不就是 skipWhile 操作符吗,不过是带索引的skip

let disposeBag = DisposeBag()
        
Observable.of("🐱", "🐰", "🐶", "🐸", "🐷", "🐵")
    .enumerated()
    .skip(while: { $0.index < 3 } )
    .subscribe(onNext: { print($0) } )
    .disposed(by: disposeBag)

打印

(index: 3, element: "🐸")
(index: 4, element: "🐷")
(index: 5, element: "🐵")

skipUntil

跳过从源 Observable 序列中发射元素,直到引用 Observable 序列发射一个元素。

image.png

let disposeBag = DisposeBag()
            
let sourceSequence = PublishSubject<String>()
let referenceSequence = PublishSubject<String>()

sourceSequence
    .skip(until: referenceSequence)
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)

sourceSequence.onNext("1")
sourceSequence.onNext("2")
sourceSequence.onNext("3")
sourceSequence.onNext("4")
sourceSequence.onNext("5")

referenceSequence.onNext("0")

sourceSequence.onNext("6")
sourceSequence.onNext("7")
sourceSequence.onNext("8")

referenceSequence.onNext("0")

sourceSequence.onNext("9")

打印

6
7
8
9