在学习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)
在同步代码中,只有前一个函数完成后才会调用该函数。例如:
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 链中使用上述内容,就像处理网络请求一样。