美文网首页
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