RxSwift 与 UiTextField
RxSwift With UiTextField
我是 RxSwift 的新手,我正在尝试执行以下操作,
- 用户类型是搜索 UiTextField
- 应用程序必须在用户完成输入后等待 1 秒,以确保在按下每个字母写入或删除按钮时不会点击 Api。
- 应用点击我的 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"
}
当我 运行 应用程序开始输入时,我收到 Response from API 消息,每个字母或退格按钮都按下了!为什么 throttle
延迟不起作用?我是不是做错了什么?
任何帮助将不胜感激
根据您对问题的描述,debounce
运算符似乎比 throttle
更合适。 debounce
仅在特定时间过去后才发射元素,在此期间没有任何发射,而 throttle
确保发射元素至少相隔一定的时间间隔。
我可以确认您使用 throttle
的代码是否按我预期的方式工作 - 如果我输入速度非常快,“来自 API 的响应”消息大约每 1 秒出现一次。如果我打字很慢,慢于每秒 1 次击键,那么每当我按下一个键时就会出现消息。换句话说,只要有编辑更改事件,throttle
就会检查是否有不到 1 秒前的前一个事件。如果有,请忽略这个新的。
但是如果你使用debounce
(相同的代码,只需将throttle
替换为debounce
),那么在每次击键后,它会等待1秒以查看文本是否领域将再次发生变化。如果它已经等待并且没有更多的编辑更改事件,它只会发出编辑更改事件。因此,如果您继续以高于每秒 1 次击键的速度打字,则 Observable 将永远不会发出任何元素。这似乎是你想要的。
您可以在 RxMarbles 上比较这两个运算符(它们在那里的名称略有不同):
我是 RxSwift 的新手,我正在尝试执行以下操作,
- 用户类型是搜索 UiTextField
- 应用程序必须在用户完成输入后等待 1 秒,以确保在按下每个字母写入或删除按钮时不会点击 Api。
- 应用点击我的 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"
}
当我 运行 应用程序开始输入时,我收到 Response from API 消息,每个字母或退格按钮都按下了!为什么 throttle
延迟不起作用?我是不是做错了什么?
任何帮助将不胜感激
根据您对问题的描述,debounce
运算符似乎比 throttle
更合适。 debounce
仅在特定时间过去后才发射元素,在此期间没有任何发射,而 throttle
确保发射元素至少相隔一定的时间间隔。
我可以确认您使用 throttle
的代码是否按我预期的方式工作 - 如果我输入速度非常快,“来自 API 的响应”消息大约每 1 秒出现一次。如果我打字很慢,慢于每秒 1 次击键,那么每当我按下一个键时就会出现消息。换句话说,只要有编辑更改事件,throttle
就会检查是否有不到 1 秒前的前一个事件。如果有,请忽略这个新的。
但是如果你使用debounce
(相同的代码,只需将throttle
替换为debounce
),那么在每次击键后,它会等待1秒以查看文本是否领域将再次发生变化。如果它已经等待并且没有更多的编辑更改事件,它只会发出编辑更改事件。因此,如果您继续以高于每秒 1 次击键的速度打字,则 Observable 将永远不会发出任何元素。这似乎是你想要的。
您可以在 RxMarbles 上比较这两个运算符(它们在那里的名称略有不同):