withLatestFrom
操作符将两个 Observables 中最新的元素通过一个函数组合起来,然后将这个组合的结果发出来。当第一个 Observable 发出一个元素时,就立即取出第二个 Observable 中最新的元素,通过一个组合函数将两个最新的元素合并后发送出去。
第一种用法
当第一个firstSubject 发出事件, 就立即取出第二个Observable中最新的元素,然后把第二个Observable中最新的元素发送出去即:
当第一个发出事件时,拿第二个的最新事件发出,如果第二个事件无值,则不处理
let disposeBag = DisposeBag()
let firstSubject = PublishSubject<String>()
let secondSubject = PublishSubject<String>()
firstSubject.withLatestFrom(secondSubject)
.subscribe(onNext:{
print($0)
})
.disposed(by: disposeBag)
firstSubject.onNext("1")
firstSubject.onNext("2")
secondSubject.onNext("3")
firstSubject.onNext("4")
/// 输出结果:3
第二种用法
当第一个Observable发出一个元素时,就立即取出第二个Observable中最新的元素,将第一个Observable中最新的元素first和第二个Observable中最新的元素second组合,然后把first + second 发送出去即:
可以在第一个Observable发出元素时,取出第一个Observable的元素和第二个Observable最新元素组合成一个新的Observable
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("1")
firstSubject.onNext("2")
secondSubject.onNext("3")
firstSubject.onNext("4")
/// 输出结果:4,3
项目实操
登录界面:一个手机号码,一个短信验证码,一个登录按钮
点击登录按钮,获取输入的手机号码与短信验证码
let telObservable = telInput.rx.text.orEmpty.asDriver()
let codeObservable = codeInput.rx.text.orEmpty.asDriver()
let tapObservable = loginBtn.rx.tap.asDriver()
/// 第一步:将手机号与短信组合成一个Observable
let userNameAndCode = Driver<(String,String)>.combineLatest(telObservable, codeObservable) {
return ($0,$1)
}
/// 当tapObservable发出事件时,就获取最新的手机号tel、验证码code,
/// 组合成一个新的Observable
tapObservable.withLatestFrom(userNameAndCode)
.drive(onNext:{ (tel,code) in
print(tel,code)
})
.disposed(by: disposebag)