为什么“点击按钮”这个动作也被认为是异步事件?

问题描述 投票:0回答:1

在学习RxSwift的时候,遇到一个问题。像button.rx.tap这样的代码也被称为

asynchronous event
,但为什么它可以被视为“异步事件”呢?通常,当我们想到“异步”时,

我们想到网络通信或磁盘 IO,但是像点击按钮这样的 UI 响应是在主线程上处理的,对吗?很难准确理解 RxSwift 定义中描述的“异步事件”的含义。您能解释一下吗?谢谢。

button.rx.tap
    .throttle(RxConst.delay, schedulers: Schedulers.main)
    .bind(onNext: { print("Button Tapped") })
    .disposed(by: disposeBag)
rx-swift rx-cocoa
1个回答
0
投票

在同步代码中,只有前一个函数完成后才会调用该函数。例如:

funcA()
funcB()

第一个函数完成后,第二个函数才会启动。

使用 Rx 时,情况不一定如此。

buttonA.rx.tap().debug("buttonA").subscribe()
buttonB.rx.tap().debug("buttonB").subscribe()

通过上述操作,即使与按钮 A 关联的点击仍然处于活动状态,与按钮 B 关联的点击也将被执行。

这可以让您做一些有趣的事情,例如像使用网络代码一样使用 UI。例如:

extension UIViewController {
    func displayInformationAlert(title: String) -> (String) -> Observable<Void> {
        { [weak self] message in
            Observable.create { observer in
                let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
                alert.addAction(UIAlertAction(title: "OK", style: .default) { _ in
                    observer.onNext(())
                    observer.onCompleted()
                })
                self?.present(alert, animated: true, completion: nil)
                return Disposables.create {
                    if !alert.isBeingDismissed { self?.dismiss(animated: true) }
                }
            }
        }
    }
}

您可以在带有

flatMap
的 Observable 链中使用上述内容,就像处理网络请求一样。

© www.soinside.com 2019 - 2024. All rights reserved.