Обратите внимание на два источника данных одновременно - PullRequest
0 голосов
/ 23 мая 2019

Я изучаю 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 - кнопка не обновляется, потому что в текст не было внесено никаких изменений!

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

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

Ответы [ 2 ]

1 голос
/ 24 мая 2019

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

        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 кодовый блок.

1 голос
/ 24 мая 2019

Вы искали функциюlateLatest?

я думаю, что это решит вашу проблему

Вы можете понять это с помощью этого блога: http://adamborek.com/combinelatest-withlatestfrom-zip/

...