如何用RxSwift实现点击按钮后5秒禁用同组按钮点击并设置latest为false?
RxSwift按钮点击节流问题解决
环境版本
- RxSwift版本:6.2.0
- CocoaPods依赖配置:
pod 'RxSwift', '6.2.0' pod 'RxCocoa', '6.2.0'
现有实现代码
TrueBtn 代码
TrueBtn.rx.tap.throttle(.seconds(5), scheduler: MainScheduler.instance) .subscribe(onNext: { [weak self] in print("TrueBtn-true") }).disposed(by: bag)
FalseBtn 代码
FalseBtn.rx.tap.throttle(.seconds(5), scheduler: MainScheduler.instance) .subscribe(onNext: { [weak self] in print("FalseBtn-false") }).disposed(by: bag)
操作流程
- 点击TrueBtn
- 1秒后再次点击TrueBtn
- 接着点击FalseBtn
当前执行结果
TrueBtn-true
等待1秒
FalseBtn-false
等待4秒
TrueBtn-true
期望执行结果
TrueBtn-true
等待1秒
FalseBtn-false
等待超过5秒
无任何输出
参数说明
throttle方法的latest参数定义:
parameter latest: Should latest element received in a due time wide time window since last element emission is emitted.
翻译:是否在自上次元素发射后的时间窗口内,发射接收到的最新元素(默认值为true)
解决方案
可以直接在调用throttle方法时显式传入latest: false参数,无需修改RxSwift API。
默认latest: true时,时间窗口内的最后一次点击会在窗口结束后触发,这就是当前多余输出的原因。设置latest: false后,时间窗口内的后续点击都会被忽略,仅保留窗口起始时的那次触发。
修改后的代码如下:
TrueBtn 修改后代码
TrueBtn.rx.tap.throttle(.seconds(5), latest: false, scheduler: MainScheduler.instance) .subscribe(onNext: { [weak self] in print("TrueBtn-true") }).disposed(by: bag)
FalseBtn 修改后代码
FalseBtn.rx.tap.throttle(.seconds(5), latest: false, scheduler: MainScheduler.instance) .subscribe(onNext: { [weak self] in print("FalseBtn-false") }).disposed(by: bag)
修改后按操作流程执行,即可得到期望结果:第一次点击TrueBtn触发输出,1秒后重复点击TrueBtn被忽略,点击FalseBtn正常输出,5秒后无额外输出。
内容的提问来源于stack exchange,提问作者jiexishede
相关产品推荐
相关产品推荐

