I read the two way binding operator in sample code of RxSwift.
func <-> <T>(property: ControlProperty<T>, variable: Variable<T>) -> Disposable {
let bindToUIDisposable = variable.asObservable()
.bindTo(property)
let bindToVariable = property
.subscribe(onNext: { n in
variable.value = n
}, onCompleted: {
bindToUIDisposable.dispose()
})
return StableCompositeDisposable.create(bindToUIDisposable, bindToVariable)
}
When property
changed, it will notify variable, and set the variable's value, while the variable's value is set, it will notify the property. I think it will lead to endless loop...
I believe you can just use bindTo
🙂. Here are implementations for ControlProperty <-> Variable
and Variable <-> Variable
:
infix operator <-> { precedence 130 associativity left }
func <-><T: Comparable>(property: ControlProperty<T>, variable: Variable<T>) -> Disposable {
let variableToProperty = variable.asObservable()
.distinctUntilChanged()
.bindTo(property)
let propertyToVariable = property
.distinctUntilChanged()
.bindTo(variable)
return StableCompositeDisposable.create(variableToProperty, propertyToVariable)
}
func <-><T: Comparable>(left: Variable<T>, right: Variable<T>) -> Disposable {
let leftToRight = left.asObservable()
.distinctUntilChanged()
.bindTo(right)
let rightToLeft = right.asObservable()
.distinctUntilChanged()
.bindTo(left)
return StableCompositeDisposable.create(leftToRight, rightToLeft)
}
Examples of ControlProperty <-> Variable
(such as UITextField
and UITextView
) are in the RxSwiftPlayer project
// Example of Variable <-> Variable
let disposeBag = DisposeBag()
let var1 = Variable(1)
let var2 = Variable(2)
(var1 <-> var2).addDisposableTo(disposeBag)
var1.value = 10
print(var2.value) // 10
var2.value = 20
print(var1.value) // 20