Как правильно обновить значения двух поведенческих реле, когда одно подписано на другое? - PullRequest
0 голосов
/ 03 февраля 2019

У меня есть два BehaviorRelay-s, один связан со вторым.Как правильно обновить значения обоих внутри одной функции?Например:

class SetupProfileVM {
   let disposeBag = DisposeBag()
   let name= BehaviorRelay<String?>(value: nil)
   let username = BehaviorRelay<String?>(value: nil)

   name.bind(to: username).dispose(by: disposeBag)

   func setNewValues(name: String, username: String) {
       name.accept(name)
       username.accept(username)
   }
}

В этом случае я хочу, чтобы имя пользователя совпадало с именем пользователя, когда значение обновляется в текстовом поле.Но мне также нужна эта функция, чтобы установить новые значения для имени и имени пользователя.Как правильно это сделать?Могу ли я быть уверен, что имя пользователя будет обновляться сначала по привязке, а только после этого по новому значению?

1 Ответ

0 голосов
/ 03 февраля 2019

Я не уверен, почему вы даже хотите использовать BahaviorRelays здесь.Для поведения, которое вы описываете, я бы ожидал увидеть что-то вроде этого:

struct SetupProfileInputs {
    let nameField: Observable<String>
    let newValues: Observable<(name: String, username: String)>
}

struct SetupProfileVM {

    let name: Observable<String>
    let username: Observable<String>

    init(_ inputs: SetupProfileInputs) {
        name = Observable.merge(inputs.nameField, inputs.newValues.map { $0.name })
        username = Observable.merge(inputs.nameField, inputs.newValues.map { $0.username })
    }
}

Или, возможно, это (в зависимости от того, какой стиль модели вы используете.)

struct SetupProfileVM {

    struct Inputs {
        let nameField: Observable<String>
        let newValues: Observable<(name: String, username: String)>
    }

    struct Outputs {
        let name: Observable<String>
        let username: Observable<String>
    }

    func transform(_ inputs: Inputs) -> Outputs {
        let name = Observable.merge(inputs.nameField, inputs.newValues.map { $0.name })
        let username = Observable.merge(inputs.nameField, inputs.newValues.map { $0.username })
        return Outputs(name: name, username: username)
    }
}

В любом случае вы присоединяете текстовое поле к вводу nameField.Что бы ни вызывало метод SetupProfileVM.setNewValues(name:username:), его необходимо преобразовать в Observable и подключить к входу newValues.

После того, как вы это сделаете, каждый раз, когда текстовое поле обновляется, SetupProfileVM.name и SetupProfileVM.username будет испускать то же значение.Каждый раз, когда newValues ​​Observable отправляет значение, имя и имя пользователя будут выдавать разные значения.

...