RxBinding provides ~>
, <~>
and ~
operators for data binding using RxSwift, to replace the bind(to:)
and disposed(by:)
method in RxSwift.
RxBinding is inspired by the following operators.
- The
<->
operator in RxBiBinding (https://github.com/RxSwiftCommunity/RxBiBinding) - The
<~
operator in ReactiveCocoa (https://github.com/ReactiveCocoa/ReactiveCocoa)
RxBinding is available through CocoaPods. To install it, simply add the following line to your Podfile:
pod 'RxBinding'
With @_expoerted import
, the operators can be used in the all file of the project.
@_exported import RxBinding
The type of text
is Observable<String?>
and the type of label.rx.text
is Binder<String?>
.
RxSwfit provides the following method for the one way data binding between them.
viewModel.text.bind(to: label.rx.text).disposed(by: disposeBag)
With the operators ~>
(bind(to:)
) and ~
(disposed(by:)
) in RxBinding, we can bind with the following simple code.
viewModel.text ~> label.rx.text ~ disposeBag
Bind an observable object to multiple binders.
viewModel.text ~> [label1, label2].map { $0.rx.text } ~ disposeBag
The type of text
is BehaviorRelay<String?>
and the type of textFeild.rx.text
is ControlProperty<String?>
.
To apply the two way data binding between them, we need the following code by RxSwift.
viewModel.text.bind(to: textFeild.rx.text).disposed(by: disposeBag)
textFeild.rx.text.bind(to: viewModel.text).disposed(by: disposeBag)
With the <~>
, a simple two way bind operator, and ~
(disposed(by:)
) in RxBinding, we can do the same thing with the following simple code.
viewModel.text <~> textFeild.rx.text ~ disposeBag
RxBinding supports using a single disposeBag
for multiple binding operators like this:
disposeBag ~ [
viewModel.text <~> textFeild.rx.text,
viewModel.uppercaseText ~> label.rx.text,
viewModel.charactersCount ~> [characterCountLabel1, characterCountLabel2].map { $0.rx.text }
]
or this:
viewModel.text <~> textFeild.rx.text ~
viewModel.uppercaseText ~> label.rx.text ~
viewModel.charactersCount ~> [characterCountLabel1, characterCountLabel2].map { $0.rx.text }
~ disposeBag
RxBinding also supports Driver
and Signal
of the RxCocoa module.
You can use ~>
operator to replace the drive()
and emit(to:)
method.
I am considering how to remove the operator ~ after the Binder or the ControlEvent property.
viewModel.text ~> label.rx.text
If anyone has a good idea about this, please contact me here #1 or create a PR. Thanks.
The operator ~>
is equal to bind(to:)
.
viewModel.text ~> label.rx.text
is euqals to
viewModel.text.bind(to: label.rx.text)
I mean how to combine the method disposed(by:)
into the operator ~>
.
To run the example project, clone the repo, and run pod install
from the Example directory first.
lm2343635, [email protected]
RxBinding is available under the MIT license. See the LICENSE file for more info.