[RxSwift] withLatestFrom 的使用時機

使用時機:Observable 1 更新時去拿 Observable 2 的資料

經典案例:

let accountTextFieldOb = textField1.rx.text.orEmpty
let passwordTextFieldOb = textField2.rx.text.orEmpty
let loginTapOb = loginButton.rx.tap        
        
let accountAndPasswordInput = Observable<(String,String)>.combineLatest(accountTextFieldOb, passwordTextFieldOb) {
            return ($0,$1)
}
loginTapOb.withLatestFrom(accountAndPasswordInput)
        .subscribe(onNext:{ (account, password) in
            // call API
            print(account,password)
        })

上面的 code 要注要的是,當 login 按鈕按下後 loginTapOb (Observable) 因為使用 withLatestFrom() 所以會拿 accountAndPasswordInput 最新的值,

然後這邊不用 flatMapLastest() 是因為不想 accountAndPasswordInput 變化 ( 例如 textField輸入) 時就馬上往下走,會導致沒按下 login 按鈕就打 API 的可能

裡面 accountAndPasswordInput 用到 combineLatest() 功用是可以合併多個 Observable

使用 withlatestFrom 如果要 Observable1 跟 Observable2 一起拿

let disposeBag = DisposeBag()
let firstSubject = PublishSubject<String>()
let secondSubject = PublishSubject<String>()
        
firstSubject.withLatestFrom(secondSubject){ (first, second) in
            return "\(first)\(second)"
}
            .subscribe(onNext:{
                print($0)
            })
            .disposed(by: disposeBag)

firstSubject.onNext("a")
firstSubject.onNext("b")
secondSubject.onNext("1")
firstSubject.onNext("c")

// print:
// c1
網頁瀏覽量: 2


尚未有留言,成為第一個留言的人吧!

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *