一般 RxSwift 用于 MVVM, MVVM 常用功能就是双向绑定,Model 和 UI 的相互数据关联。
看下官方的 <->
在 RxSwift 的案例代码中,有一个 Operators.swift
文件,提供了一个 <->
双向绑定操作符函数。
func <-> <T>(property: ControlProperty<T>, relay: BehaviorRelay<T>) -> Disposable {
let bindToUIDisposable = relay.bind(to: property)
let bindToRelay = property
.subscribe(onNext: { n in
relay.accept(n)
}, onCompleted: {
bindToUIDisposable.dispose()
})
return Disposables.create(bindToUIDisposable, bindToRelay)
}
代码逻辑很清晰,relay.bind(to: property)
, 模型绑定 UI, bind
是 RxCocoa
对 subscribe
的封装,换句话,UI 订阅了模型的事件。
property.subscribe
, 模型订阅了 UI 的事件。
就这样,双向绑定完成了。
为什么不会陷入事件循环?
打个比方,如下代码,模型与 UI 绑定,点击按钮改模型,给模型传入一个事件。
(textFieldOne.rx.text <-> messageVal).disposed(by: disposeBag)
btn.rx.tap.subscribe(onNext: { (_) in
self.messageVal.accept("Go")
}).disposed(by: disposeBag)
模型 messageVal 收到一个事件,传给 UI