RxSwift: 按钮来回点击

FRP 的经常使用例子,就是按钮监听输入框的文字。swift

几个按钮只有一个高亮,来回切换的状况下,就是给本身作事件绑定。安全

先合并信号,而后每一个按钮都绑定那个信号。ui

代码以下:spa

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 展开,就是code

Disposables.create(Disposables.create(Disposables.create(Disposables.create(), oneBtnSubscription), twoBtnSubscription), threeBtnSubscription)
复制代码

换成循环,cdn

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)
复制代码

参考: stackoverflow.com/questions/4…blog

相关文章
相关标签/搜索