同时观察两个数据源
Observe two sources of data at once
我正在学习 RxSwift 和 RxCocoa。
我 运行 遇到过这个问题:
我有 UITextField、UIPickerView 和 UIButton。
一旦 UITextField 有效,UIButton 就应该启用。从 UIPickerView 中选择的每个项目都有不同的验证正则表达式。
到目前为止,这是我的代码:
textField.rx.text
.map({ (text) -> Bool in
return self.validate(text!, self.regex)})
.subscribe(onNext: { (valid) in
self.button.alpha = valid ? 1 : 0.5
self.button.isEnabled = valid
})
.disposed(by: disposeBag)
pickerView.rx.itemSelected.subscribe(onNext: { row, value in
self.regex = getRegex(row)
}).disposed(by: disposeBag)
所以我首先从 pickerView 中选择正则表达式,然后观察文本变化。当我想先输入文本然后从 pickerView 选择一些不同的正则表达式时出现问题 - 按钮不更新,因为没有对文本进行任何更改!
所以我猜我应该以某种方式压缩或合并这两个来源(可观察的?),这样按钮就可以同时观察到每个来源的任何变化。
我该如何解决这个问题?
您搜索过 combineLatest 函数吗?
我想它会解决你的问题
你可以通过这个博客了解它:http://adamborek.com/combinelatest-withlatestfrom-zip/
好的,我有点解决了(使用 提到的 combineLatest)。
我将它发布给其他正在寻找类似内容的人:
let pickObs = pickerView.rx.itemSelected.map { (row, component) -> String? in
return getRegex(row)
}
Observable.combineLatest(textField.rx.text, pickObs.startWith("♂️")){ text, regex -> Bool in
return self.validate(text, regex)
}.subscribe(onNext: { (valid) in
self.addNewDevice.alpha = valid ? 1 : 0.5
self.addNewDevice.isEnabled = valid
}).disposed(by: disposeBag)
pickObs.startWith("♂️")是有的,因为找不到pre-selectpickerView的方法。 (pickerView.selectRow 没有触发 pickerView.rx.itemSelected 代码块。
我正在学习 RxSwift 和 RxCocoa。 我 运行 遇到过这个问题:
我有 UITextField、UIPickerView 和 UIButton。 一旦 UITextField 有效,UIButton 就应该启用。从 UIPickerView 中选择的每个项目都有不同的验证正则表达式。
到目前为止,这是我的代码:
textField.rx.text
.map({ (text) -> Bool in
return self.validate(text!, self.regex)})
.subscribe(onNext: { (valid) in
self.button.alpha = valid ? 1 : 0.5
self.button.isEnabled = valid
})
.disposed(by: disposeBag)
pickerView.rx.itemSelected.subscribe(onNext: { row, value in
self.regex = getRegex(row)
}).disposed(by: disposeBag)
所以我首先从 pickerView 中选择正则表达式,然后观察文本变化。当我想先输入文本然后从 pickerView 选择一些不同的正则表达式时出现问题 - 按钮不更新,因为没有对文本进行任何更改!
所以我猜我应该以某种方式压缩或合并这两个来源(可观察的?),这样按钮就可以同时观察到每个来源的任何变化。
我该如何解决这个问题?
您搜索过 combineLatest 函数吗?
我想它会解决你的问题
你可以通过这个博客了解它:http://adamborek.com/combinelatest-withlatestfrom-zip/
好的,我有点解决了(使用
let pickObs = pickerView.rx.itemSelected.map { (row, component) -> String? in
return getRegex(row)
}
Observable.combineLatest(textField.rx.text, pickObs.startWith("♂️")){ text, regex -> Bool in
return self.validate(text, regex)
}.subscribe(onNext: { (valid) in
self.addNewDevice.alpha = valid ? 1 : 0.5
self.addNewDevice.isEnabled = valid
}).disposed(by: disposeBag)
pickObs.startWith("♂️")是有的,因为找不到pre-selectpickerView的方法。 (pickerView.selectRow 没有触发 pickerView.rx.itemSelected 代码块。