我第一次在我的项目中使用ReactiveKit的Bond库并试图掌握它。
在我的应用中,有一个textview。当用户输入时,API调用需要在三个阶段触发。
我试图看看能不能做到这一点。
textView.reactive.text
.map { $0!.characters.count > 0 }
.throttle(seconds: 8)
.observeNext { _ in
print("-> Call API")
}
我也遇到过这个问题。即使我添加了字符数验证,但只要执行此代码,调用API 就会打印到控制台。没有键盘甚至成为textview的第一响应者。
以8秒间隔射击的方法部分工作正常。再一次,我无法找到实现第三种情况的方法。
感谢任何帮助。
答案 0 :(得分:1)
要解决第一个问题,您需要过滤空字符串,而不是将它们映射到布尔值。
你已经正确地进行了节流。这样每8秒间隔最多只能发生一次事件。
现在,只有在10秒内没有其他事件后才会触发事件,您需要使用去抖操作符。
最后,您将对这两个事件中的任何一个执行API调用,因此您必须合并信号才能接收这两个事件。
这是一个详细的代码,你可能应该使它紧凑:)
let text = textView.reactive.text.ignoreNil()
let textEntered = text.filter { !$0.isEmpty }
let atMostOncePer8Seconds = textEntered.throttle(seconds: 8)
let on10SecondsAfterFinalEntry = textEntered.debounce(interval: 10)
let doTheCall = merge(atMostOncePer8Seconds, on10SecondsAfterFinalEntry)
doTheCall.observeNext { text in
print("-> Call API", text)
}