使用時機:當 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