本文是示例主要来自于官方的实例代码,可从这里下载 ,实例代码稍有改动。其中的图片来自于reactivex.io/
本文主要的作用是查看实例代码并查看对应实例代码的效果,不需要运行项目
操作符目录
- RxSwift官方使用示例之<创建和订阅Observables>
- RxSwift官方使用示例之<使用Subjects>
- RxSwift官方使用示例之<组合操作符>
- RxSwift官方使用示例之<转换操作符>
- RxSwift官方使用示例之<过滤及条件操作符>
- RxSwift官方使用示例之<数学和聚合操作符>
- RxSwift官方使用示例之<可连接操作符>
- RxSwift官方使用示例之<错误处理操作符>
debug 操作符会打印所有的 subscriptions, events, disposals
filter
只发出 Observable
序列中满足指定条件的元素
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
序列指定索引处的元素
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 序列的开头发出指定数量的元素
let disposeBag = DisposeBag()
Observable.of(1, 2, 3, 4)
.take(2)
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
打印
1
2
takeLast
仅从 Observable 序列的末尾发出指定数量的元素
let disposeBag = DisposeBag()
Observable.of(1, 2, 3, 4)
.take(1)
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
打印
4
takeWhile
从 Observable 序列的开头发出满足条件的元素
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 序列发出元素
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
序列的开头跳过发射指定数量的元素
let disposeBag = DisposeBag()
Observable.of(1, 2, 3, 4)
.skip(2)
.subscribe { print($0) }
.disposed(by: disposeBag)
打印
next(3)
next(4)
completed
skipWhile
从 Observable
序列的开头跳过发射满足条件的元素
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
序列发射一个元素。
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