RxSwift中UITextField设置1秒throttle仍每次输入触发接口请求如何解决
问题原因分析
- 操作符选择错误:你当前的需求是「用户停止输入1秒后再触发请求」,需要用
debounce操作符,而不是throttle。两者的核心差异如下:throttle:指定时间窗口内最多发送一次事件,不会因为新的事件输入重置计时,如果你连续每隔0.5秒输入一次字符,1秒窗口的throttle会每1秒触发一次,自然会出现连续输入也会打印响应的情况debounce:只有当连续两个事件的间隔超过指定时长时,才会发送最后一次事件,每次新的输入都会重置计时,完全符合搜索场景的防抖需求
- 额外优化点:你原代码中直接捕获
self会存在循环引用风险,建议加[weak self]规避;同时也可以直接监听UITextField的rx.text序列,不需要额外监听editingChanged事件再取最新值,写法更简洁。
正确实现代码
class DestinationSearch: UIViewController { let searchTF = UITextField() var disposeBag = DisposeBag() override func viewDidLoad() { super.viewDidLoad() setUpUI() searchTF.rx.text // 防抖:停止输入1秒后触发 .debounce(.milliseconds(1000), scheduler: MainScheduler.instance) // 过滤空值 .compactMap { $0 } // 可选:前后输入内容一致时不触发,减少无用请求 .distinctUntilChanged() .subscribe(onNext:{ [weak self] query in guard let self = self else { return } print(self.hitSomeApi(query: query)) }).disposed(by: disposeBag) } func hitSomeApi(query: String) -> String { return query + " Response from API" } }
内容的提问来源于stack exchange,提问作者Mohammed Riyadh
相关产品推荐
相关产品推荐

