当一个行为继电器订阅另一个行为继电器时,更新两个行为继电器值的正确方法是什么?
What is the proper way to update values of two Behavior Relays when one is subscribed to other?
我有两个 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)
}
}
在这种情况下,当文本字段更新值时,我希望用户名与用户相同。但我还需要此功能来为名称和用户名设置新值。这样做的正确方法是什么?我可以确定用户名将首先通过它的绑定更新,然后才通过它的新值更新吗?
我不确定你为什么要在这里使用 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 { [=10=].name })
username = Observable.merge(inputs.nameField, inputs.newValues.map { [=10=].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 { [=11=].name })
let username = Observable.merge(inputs.nameField, inputs.newValues.map { [=11=].username })
return Outputs(name: name, username: username)
}
}
在任何一种情况下,您都将文本字段附加到 nameField
输入。调用 SetupProfileVM.setNewValues(name:username:)
方法的任何东西都需要转换为 Observable 并连接到 newValues
输入。
一旦这样做,每次更新文本字段时,SetupProfileVM.name
和 SetupProfileVM.username
都会发出相同的值。每次 newValues Observable 发出一个值时,name 和 username 都会发出不同的值。
我有两个 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)
}
}
在这种情况下,当文本字段更新值时,我希望用户名与用户相同。但我还需要此功能来为名称和用户名设置新值。这样做的正确方法是什么?我可以确定用户名将首先通过它的绑定更新,然后才通过它的新值更新吗?
我不确定你为什么要在这里使用 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 { [=10=].name })
username = Observable.merge(inputs.nameField, inputs.newValues.map { [=10=].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 { [=11=].name })
let username = Observable.merge(inputs.nameField, inputs.newValues.map { [=11=].username })
return Outputs(name: name, username: username)
}
}
在任何一种情况下,您都将文本字段附加到 nameField
输入。调用 SetupProfileVM.setNewValues(name:username:)
方法的任何东西都需要转换为 Observable 并连接到 newValues
输入。
一旦这样做,每次更新文本字段时,SetupProfileVM.name
和 SetupProfileVM.username
都会发出相同的值。每次 newValues Observable 发出一个值时,name 和 username 都会发出不同的值。