RxBinding
RxBinding 为使用 RxSwift 进行数据绑定提供了 ~>
,<~>
和 ~
操作符,以替换 RxSwift 中的 bind(to:)
和 disposed(by:)
方法。
RxBinding 启发于以下操作符。
- RxBiBinding 中的
<->
操作符(https://github.com/RxSwiftCommunity/RxBiBinding) - ReactiveCocoa 中的
<~
操作符(https://github.com/ReactiveCocoa/ReactiveCocoa)
文档
RxBinding 通过 CocoaPods 提供。要安装它,只需在 Podfile 中添加以下行
pod 'RxBinding'
使用 @_expoerted import
,操作符可以在项目的所有文件中使用。
@_exported import RxBinding
~>
使用 text
的类型为 Observable<String?>
,而 label.rx.text
的类型为 Binder<String?>
。RxSwift 为它们之间的一对一数据绑定提供了以下方法。
viewModel.text.bind(to: label.rx.text).disposed(by: disposeBag)
使用 RxBinding 中的操作符 ~>
(bind(to:)
)和 ~
(disposed(by:)
),我们可以用以下简单代码进行绑定。
viewModel.text ~> label.rx.text ~ disposeBag
将可观察对象绑定到多个绑定器。
viewModel.text ~> [label1, label2].map { $0.rx.text } ~ disposeBag
<~>
使用 text
的类型是 BehaviorRelay<String?>
,而 textFeild.rx.text
的类型是 ControlProperty<String?>
。为了在这两者之间应用双向数据绑定,我们需要以下 RxSwift 代码。
viewModel.text.bind(to: textFeild.rx.text).disposed(by: disposeBag)
textFeild.rx.text.bind(to: viewModel.text).disposed(by: disposeBag)
使用 <~>
二向绑定操作符 和 RxBinding 中的 ~
(disposed(by:)
),我们可以用以下简代码做同样的事情。
viewModel.text <~> textFeild.rx.text ~ disposeBag
多绑定
RxBinding 支持为多个绑定操作符使用单个 disposeBag
,如下所示
disposeBag ~ [
viewModel.text <~> textFeild.rx.text,
viewModel.uppercaseText ~> label.rx.text,
viewModel.charactersCount ~> [characterCountLabel1, characterCountLabel2].map { $0.rx.text }
]
或这样
viewModel.text <~> textFeild.rx.text ~
viewModel.uppercaseText ~> label.rx.text ~
viewModel.charactersCount ~> [characterCountLabel1, characterCountLabel2].map { $0.rx.text }
~ disposeBag
RxCocoa
RxBinding 也支持 RxCocoa 模块的 Driver
和 Signal
。你可以使用 ~>
操作符来替代 drive()
和 emit(to:)
方法。
需要您的帮助
我正在考虑如何在 Binder 或 ControlEvent 属性之后移除 ~ 操作符。
viewModel.text ~> label.rx.text
如果有任何好的想法,请在此处联系我 https://github.com/RxSwiftCommunity/RxBinding/issues/1 或创建一个 PR。谢谢。
~>
操作符等于 bind(to:)
。
viewModel.text ~> label.rx.text
等同于
viewModel.text.bind(to: label.rx.text)
我的意思是,如何将方法 disposed(by:)
结合到操作符 ~>
中。
示例
要运行示例项目,首先克隆仓库,然后在Example目录中运行pod install
。
作者
lm2343635, [email protected]
许可协议
RxBinding遵守MIT许可协议。有关更多信息,请参阅LICENSE文件。