两个Observable中的内容,在逻辑上,是有关联的。例如,当我们提交一个表单的时候,就同时存在着两个事件序列,一个是提交按钮的点击事件序列;另一个是表单内值的序列。每次点击提交按钮的时候,都需要知道当前表单中的内容,以便发送给服务器。
withLatestFrom: 两个可观察序列合并为一个可观察序列,当第二个源有新数据的时候,再发送第一个源,会将第二个源的新数据订阅到
模拟表单提交,当点击按钮时,就读取textFiled中最新的事件。
let bag = DisposeBag()
let textField = PublishSubject<String>()
let submitBtn = PublishSubject<String>()
submitBtn.withLatestFrom(textField).subscribe(onNext: {
print($0)
}, onError: nil, onCompleted: {
print("onCompleted")
}) {
print("onDisposed")
}.disposed(by: bag)
submitBtn.onNext("tap1")
textField.onNext("RXSwift")
submitBtn.onNext("tap2")
执行过程
submitBtn
--------------------------tap1--------------------------------------------tap2---------------------
textFild
--------------------------------------------------RXSwift------------------------------------------
submitBtn.withLatestFrom(textField)
-------------------------------------------------RXSwift--------------------------------------------
note
- 当submitBtn 发出 tap1 信号时,textFild并没有输入信号,所以 withLatestFrom 的 closure 没有任何打印。
- 当submitBtn 发出 tap2 信号时,textFild 的输入信号是 "RXSwift",所以 withLatestFrom 的 closure 打印是 “RXSwift”。
switchLatest:在多个Observables之间进行跳转
let bag = DisposeBag()
let coding = PublishSubject<String>()
let testing = PublishSubject<String>()
let working = PublishSubject<PublishSubject<String>> ()
working.subscribe(onNext: {
print($0)
}, onError: nil, onCompleted: {
print("onCompleted")
}) {
print("onDisposed")
}.disposed(by: bag)
working.onNext(coding)
coding.onNext("version1")
working.onNext(testing)
testing.onNext("FAILED")
working.onNext(coding)
coding.onNext("version2")
working.onNext(testing)
testing.onNext("PASS")
执行过程
coding
--------------------------version1---------------------------------------------version2------------------------------------
testing
--------------------------------------------------FAILED------------------------------------------------------PASS----------
working.onNext(coding) working.onNext(testing) working.onNext(coding) working.onNext(testing)
---------------------------version1----------------FAILED-----------------------version2----------------------PASS------------
note
-
第一对,working.onNext(coding)表示当前的工作流是coding,然后,我们用 coding.onNext("version1")表示提交了一个版本;此时,我们会订阅到字符串Version1。
-
第二对,我们用working.onNext(testing)表示当前工作流切换到了testing。这样,我们就只能订阅到testing中发生的事件了。于是,我们用testing.onNext("FAILED")表示测试失败了,我们会订阅到FAILED事件。
-
第三对,我们用working.onNext(coding)又回到了coding。现在,又可以订阅到coding Observable中的事件了。我们用coding.onNext("version2")模拟又提交了一次Version2。
-
最后,我们又切换到了testing,在testing.onNext("PASS")之后,就会订阅到PASS事件了。
网友评论