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

相關文章
相關標籤/搜索