基于 Observable 值处理按钮触摸

Handling button touch based on the Observable value

我想知道基于 Observable 处理按钮点击的最佳做法是什么。我有枚举:

enum ButtonState {
    case idle, valid, nonValid
}

Observable 结合了两个 Observables:

var buttonStateObservable: Observable<ButtonState> {
        return Observable.combineLatest(isAddingVariable.asObservable(), addItemName.asObservable(),
                                        resultSelector: { isAdding, itemName in
                                            if isAdding {
                                                return !itemName.isEmpty ? .valid : .nonValid
                                            }
                                            return .idle
        })
    }

在我的 ViewController 中,我订阅了这个 observable 并更新了 UIButton 的 UI。我想处理点击此按钮并根据此可观察对象执行某些操作。什么是最好的方法?

RxSwift 已经有 ControlEvent 包装了 UIButtonTouchUpInside 事件。您可以通过 .rx.tap:

访问它
button.rx.tap.subscribe(onNext: {
    self.button.setTitle("\(arc4random_uniform(100))", for: .normal)
    self.button.layer.borderColor = UIColor.random.cgColor // or your special color
})
.disposed(by: bag)

点击 3 次的结果:


UPD.

您可以通过.withLatestFrom()检查其他可观察值。改进的顶部示例:

let subject = BehaviorSubject<Bool>(value: true)

button.rx.tap.asDriver()
    .withLatestFrom(subject.asDriver(onErrorJustReturn: false))
    .drive(onNext: { value in
        if value {
            self.button.setTitle("\(arc4random_uniform(100))", for: .normal)
            self.button.layer.borderColor = UIColor.random().cgColor
        }
        subject.onNext(!value)
    })
    .disposed(by: bag)

因此,在您的情况下,您可以将 Observable.combineLatest(...) 放入 .withLatestFrom 并使用这些值执行逻辑。