gpt4 book ai didi

ios - RxSwift : Deliver the first item immediately, 去抖以下项目

转载 作者:行者123 更新时间:2023-11-28 05:56:27 28 4
gpt4 key购买 nike

我有一个要验证的文本字段,我想在用户输入时禁用一个按钮。用户停止输入后(去抖动 1 秒),将执行验证并根据结果有条件地启用按钮。请注意用户仅键入一个字符时的极端情况,验证仍应进行。

--"a"-"ab"-"abc"------------------"ab"--"a"------------------"ab"-----------------

--false---------validate("abc")---false----validate("a")-----false--validate("ab")

这个 SO ( Deliver the first item immediately, 'debounce' following items ) 在 RxJava 中提出了以下解决方案。但它似乎只返回第一个元素,而不是当用户在去抖动后再次开始输入时?如果我错了请纠正我

Observable.from(items).publish(publishedItems -> 
publishedItems.limit(1).concatWith(
publishedItems.skip(1).debounce(1, TimeUnit.SECONDS)
)
)

最佳答案

一个选项是将问题“用户是否正在输入”与“输入是否有效”分开。

描述用户是否正在输入的一种(有点笨拙的)方式:

let isTyping = PublishSubject<Bool>()

textField.rx.text
.map { _ in true }
.bind(to: isTyping)
.disposed(by: disposeBag)

textField.rx.text
.debounce(1.0, scheduler: MainScheduler.instance)
.map { _ in false}
.bind(to: isTyping)
.disposed(by: disposeBag)

然后,您可以像这样描述按钮启用状态:

isTyping.withLatestFrom(isValid) { !$0 && $1 }
.bind(to: button.rx.isEnabled)

当然,要让这种方法在用户开始输入时立即生效,最好让 isValid 以一个值开头。

您还可以通过以下方式简化它。如果这些值仅在本地使用,这可能没问题。

textField.rx.text
.map { _ in false }
.bind(to: button.rx.isEnabled)
.disposed(by: disposeBag)

textField.rx.text
.debounce(1.0, scheduler: MainScheduler.instance)
.flatMap { [weak self] in self?.validate($0) }
.bind(to: button.rx.isEnabled)
.disposed(by: disposeBag)

请注意,使用这种方法时,需要在用户继续输入时取消异步验证操作。

希望有人可以提出更简洁的解决方案,但我认为这是一个不错的起点。

关于ios - RxSwift : Deliver the first item immediately, 去抖以下项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51344309/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com