一次观察两个数据源

时间:2019-05-23 14:58:51

标签: swift rx-swift rx-cocoa

我正在学习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中选择一些不同的正则表达式时,会出现问题-该按钮不会更新,不会对文本进行任何更改!

所以我想我应该以某种方式压缩或合并这两个源(可观察到的?),以便该按钮可以一次观察到每个源的任何变化。

我应该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

您是否搜索过CombineLatest函数?

我认为它将解决您的问题

您可以通过以下博客了解它:http://adamborek.com/combinelatest-withlatestfrom-zip/

答案 1 :(得分:1)

好的,我有点解决了(使用Abdorahman中提到的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(“ ‍♂️”)在那里,因为我找不到预选择pickerView的方法。 (pickerView.selectRow并未触发pickerView.rx.itemSelected代码块。