You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 09:56:20