RxSwift 系列(三) -- Combination Operators
前言
本篇文章将要学习如何将多个Observables
组合成一个Observable
。Combination Operators
在RxSwift
中的实现有五种:
startWith
merge
zip
combineLatest
switchLatest
startWith
在Observable
释放元素之前,发射指定的元素序列。更多详情
上面这句话是什么意思呢?翻译成大白话就是在发送一个东西之前,我先发送一个我指定的东西。
举个??:
let disposeBag = DisposeBag()
Observable.of(["C","C++","OC"]).startWith(["先吃饱饭再学习"]).subscribe({ (event) in
print(event)
}).disposed(by: disposeBag)
在我们发射["C","C++","OC"]
之前,我们指定了发射["先吃饱饭再学习"]
,因此控制台上的打印结果是:
next(["先吃饱饭再学习"])
next(["C", "C++", "OC"])
completed
startWith
和栈类似,先进后出。什么意思呢?你可以在上面的例子中再添加几个.startWith()
试试。
merge
将多个Observable
组合成单个Observable
,并且按照时间顺序发射对应事件。更多详情
感觉和git
的merge
操作是一样的效果。
let disposeBag = DisposeBag()
let subject1 = PublishSubject<String>()
let subject2 = PublishSubject<String>()
Observable.of(subject1, subject2)
.merge()
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
subject1.onNext("???")
subject1.onNext("???")
subject2.onNext("①")
subject2.onNext("②")
subject1.onNext("??")
subject2.onNext("③")
zip
将多个Observable
(注意:必须是要成对)组合成单个Observable
,当有事件到达时,会在每个序列中对应的索引上对应的元素发出。(ps:之前版本的RxSwift
好像最多只能组合8个Observable
)更多详情
let disposeBag = DisposeBag()
let subject1 = PublishSubject<String>()
let subject2 = PublishSubject<String>()
Observable.zip(subject1, subject2) { string1,string2 in
"\(string1)--\(string2)"
}.subscribe(onNext: {print($0)}).disposed(by: disposeBag)
subject1.onNext("A")
subject1.onNext("B")
subject1.onNext("C")
subject2.onNext("1")
subject2.onNext("2")
上述代码,因为subject.onNext("C")
没有与之对应的Observable
,因此不会打印,让我们看看打印结果:
A--1
B--2
combineLatest
当一个项目由两个Observables
发射时,通过一个指定的功能将每个Observable
观察到的最新项目组合起来,并根据该功能的结果发射事件。更多详情
let disposeBag = DisposeBag()
let subject1 = PublishSubject<String>()
let subject2 = PublishSubject<String>()
Observable.combineLatest(subject1, subject2) { string1,string2 in
"\(string1)--\(string2)"
}.subscribe(onNext: {print($0)}).disposed(by: disposeBag)
subject1.onNext("A")
subject2.onNext("1")
subject2.onNext("2")
subject1.onNext("B")
subject1.onNext("C")
输出结果:
A--1
A--2
B--2
C--2
图解:
switchLatest
切换Observable
队列。
let disposeBag = DisposeBag()
let subject1 = BehaviorSubject(value: "1")
let subject2 = BehaviorSubject(value: "A")
let variable = Variable(subject1)
variable.asObservable()
.switchLatest()
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
subject1.onNext("2")
subject1.onNext("3")
variable.value = subject2
subject1.onNext("4")
subject2.onNext("B")
打印结果:
1
2
3
A
B
图解:
致谢
如果发现有错误的地方,欢迎评论,感谢!
时间: 2024-10-25 04:16:43