FRP 的常用例子,就是按钮监听输入框的文字。
几个按钮只有一个高亮,来回切换的情况下,就是给自己做事件绑定。
先合并信号,然后每个按钮都绑定那个信号。
代码如下:
let disposeBag = DisposeBag() // 先强制拆包 let buttons = [oneBtn, twoBtn, threeBtn].map{ $0! } // merge 出,最新的点击事件(信号) let selectedButton = Observable.from( buttons.map { button in button.rx.tap.map { button } } ).merge() // 每个按钮的状态,都绑定最新的信号 buttons.reduce(Disposables.create()) { disposable, button in let subscription = selectedButton.map { $0 == button } .bind(to: (button.rx.isSelected)) return Disposables.create(disposable, subscription) }.disposed(by: disposeBag)复制代码
最后一段,reduce 比较难以理解。
把 reduce 展开,就是
Disposables.create(Disposables.create(Disposables.create(Disposables.create(), oneBtnSubscription), twoBtnSubscription), threeBtnSubscription)复制代码
换成循环,
var disposable = Disposables.create() for button in buttons { let subscription = selectedButton.map { $0 == button } .bind(to: button.rx.isSelected) disposable = Disposables.create(disposable, subscription) } // 最后交给线程安全的 DisposeBag, 自动释放内存 disposable.disposed(by: disposeBag)复制代码
参考: