Наблюдайте сразу за двумя источниками данных

Я изучаю RxSwift и RxCocoa. Я столкнулся с этой проблемой:

У меня есть UITextField, UIPickerView и UIButton. UIButton должен стать активным после того, как UITextField станет действительным. Для каждого элемента, выбранного из 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 - кнопка не обновляется, потому что в текст не было внесено никаких изменений!

Итак, я предполагаю, что мне нужно как-то заархивировать или объединить эти два источника (наблюдаемые?), Чтобы эта кнопка могла сразу наблюдать за любыми изменениями в каждом из них.

Как мне подойти к этой проблеме?


person user3554626    schedule 23.05.2019    source источник


Ответы (2)



Хорошо, я как бы решил это (используяcommonLatest, как упоминалось Абдорахманом). Я отправляю его всем, кто ищет что-то подобное:

        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.

person user3554626    schedule 24.05.2019