Swiftpack.co - Package - RxSwiftCommunity/RxBinding

RxBinding

CI Status Version License Platform swift

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)

Documentation

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

Usage of ~>

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

Usage of <~>

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

Multiple Bindings

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

RxCocoa

RxBinding also supports Driver and Signal of the RxCocoa module. You can use ~> operator to replace the drive() and emit(to:) method.

NEED YOUR HELP

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 https://github.com/RxSwiftCommunity/RxBinding/issues/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 ~>.

Example

To run the example project, clone the repo, and run pod install from the Example directory first.

Author

lm2343635, lm2343635@126.com

License

RxBinding is available under the MIT license. See the LICENSE file for more info.

Github

link
Stars: 32

Dependencies

Used By

Total: 0

Releases

0.4 - 2020-05-25 15:28:05

  • Support emit, close #2
  • Fix some issue for drive

- 2019-05-21 07:22:43

  • Adapt for RxSwfit 5.0

- 2019-04-22 08:00:02

Multiple bindings.

disposeBag ~ [
    viewModel.text <~> textFeild.rx.text,
    viewModel.uppercaseText ~> label.rx.text,
    viewModel.charactersCount ~> [characterCountLabel1, characterCountLabel2].map { $0.rx.text }
]

- 2019-04-19 05:57:56

  • Support one way binding operator ~> for Driver.
  • Support using a single disposeBag for multiple binding operators like:
disposeBag
    ~ viewModel.text <~> textFeild.rx.text
    ~ viewModel.uppercaseText ~> label.rx.text
    ~ viewModel.charactersCount ~> [characterCountLabel1, characterCountLabel2].map { $0.rx.text }

- 2019-04-12 04:03:50

  • Support multiple one way data binding.
viewModel.text ~> [label1, label2].map { $0.rx.text } ~ disposeBag

- 2019-04-12 03:10:29