Есть ли какой-нибудь приоритетный оператор в RxSwift? - PullRequest
1 голос
/ 11 января 2020

У меня есть текстовое поле, в котором есть 2 правила проверки: минимальное количество символов и буквенно-цифровые символы.

Я хочу иметь возможность представлять пользователю, что он делает неправильно в метке ошибки, но проблема в том, что если я связываю текстовое поле с обоими правилами, это может быть жутко, потому что, как только одно правило будет утверждено, пользовательский интерфейс делает немного мерцает от цвета разделителя, например, меняется с красного на зеленый на красный из-за сбоя другой проверки.

Я хотел бы знать, есть ли способ расставить приоритеты одного связывания над другим. Например, это то, что у меня сейчас есть:

let minimumValidator 
    = inputField.textField
      .rx.text.orEmpty.map { $0.count >= 8 } // Min amount of chars is 8

minimumValidator.bind(to: inputField.rx.minimumChars)
    .disposed(by: bag)

let regexValidator 
    = inputField.textField
      .rx.text.orEmpty.map { $0.matches(regex) }

regexValidator.bind(to: inputField.rx.regex)
    .disposed(by: bag)

rx.minimumChars и rx.regex являются пользовательскими связывателями

    var minimumChars: Binder<Bool> {
        return Binder(self.base) { control, value in
            UIView.animate(withDuration: 0.1) {
                if value {
                    control.separator.backgroundColor = .white
                    control.errorLabel.isHidden = true
                } else {
                    let error = "Needs more characters"
                    control.separator.backgroundColor = .red
                    control.errorLabel.text = error
                    control.errorLabel.isHidden = false
                }
            }
        }
    }

Так что моя идея состоит в том, чтобы расставить приоритеты для idk ... скажем, буквенно-цифровая проверка - поэтому будет отображаться ошибка от минимального символа до появления буквенно-цифровой ошибки, поэтому, пока пользователь не разрешит буквенно-цифровую проверку, он будет игнорировать другой поток из минимального количества символов. Я почти уверен, что мне не хватает какой-то комбинации combLatest с merge или idk.

1 Ответ

1 голос
/ 11 января 2020

Создайте один Binder, который использует пользовательское перечисление

enum Validation {
    case valid
    case minimumChars
    case alphaNumeric
}

И затем каждый валидатор возвращает значение этого перечисления. Затем объедините последние два валидатора и сопоставьте результат с одной проверкой и связыванием.

Что-то вроде

Observable.combineLatest(minimumValidator, regexValidator) { v1, v2 in
    // if v1 is not valid return it. Otherwise return v2
}
...