美文网首页
RXSwift - 在不同的Observables 之间跳转 w

RXSwift - 在不同的Observables 之间跳转 w

作者: 内蒙小猿 | 来源:发表于2020-08-22 06:14 被阅读0次

两个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--------------------------------------------

\color{#DEB887}{执行结果: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------------

\color{#DEB887}{执行结果: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事件了。

相关文章

网友评论

      本文标题:RXSwift - 在不同的Observables 之间跳转 w

      本文链接:https://www.haomeiwen.com/subject/vrfpjktx.html