RxSwift With UiTextField



我是RxSwift的新手,我正在尝试执行以下操作,

  • 用户类型为搜索UiTextField
  • App必须在用户完成输入后等待1秒,以确保在每个字母写入或删除按钮按下时不会击中Api。
  • App点击我的Api搜索

我尝试了下面的代码作为示例

class DestinationSearch: UIViewController {

let searchTF = UITextField()    
var disposeBag = DisposeBag()

override func viewDidLoad() {
super.viewDidLoad()
setUpUI()


searchTF.rx.controlEvent(.editingChanged)
.throttle(.milliseconds(1000), scheduler: MainScheduler.instance)
.withLatestFrom(searchTF.rx.text)
.subscribe(onNext:{ query in
print(self.hitSomeApi(query: query ?? "--"))
}).disposed(by: disposeBag)
}
func hitSomeApi(query: String) -> String {
return query + " Response from API"
}

当我运行应用程序并开始输入时,我从API得到响应消息与每个字母或退格键按下!为什么throttle延迟不工作?我做错什么了吗?

任何帮助都将不胜感激

根据您对问题的描述,似乎debounce操作符比throttle更合适。

debounce只在一段时间后才释放一个元素,而在这段时间内没有任何元素被释放,而throttle保证元素的释放至少间隔一段时间。

我可以确认你的代码使用throttle工作如我所期望的-如果我键入非常快,从api的响应消息大约每1秒出现一次。如果我的输入速度很慢,低于每秒1次击键,那么每当我按下一个键时,消息就会出现。换句话说,无论何时发生编辑更改事件,throttle都会检查是否存在少于1秒前的前一个事件。如果有,忽略这个新的

如果您使用debounce(相同的代码,只是用debounce替换throttle),那么在每次击键之后,它将等待1秒,以查看文本字段是否会再次更改。只有当它等待并且没有更多的编辑更改事件时,它才会发出编辑更改事件。因此,如果您以高于每秒1次击键的速度输入,则可观察对象将不会发出任何元素。这似乎是你想要的。

您可以在RxMarbles上比较这两个操作符(它们的名称略有不同):

  • debounceTime
  • throttleTime

最新更新