使用 Bond 定期触发方法
Posted
技术标签:
【中文标题】使用 Bond 定期触发方法【英文标题】:Fire a method periodically using Bond 【发布时间】:2017-02-14 09:56:39 【问题描述】:我是第一次在我的项目中使用 ReactiveKit 的 Bond 库并试图掌握它。
在我的应用程序中,有一个文本视图。当用户输入时,API 调用需要在三个阶段触发。
-
只要输入第一个字符。
此后每 8 秒。
在用户键入最后一个字符后 10 秒后终于有一次。
我正在尝试看看我是否可以做到这一点。
textView.reactive.text
.map $0!.characters.count > 0
.throttle(seconds: 8)
.observeNext _ in
print("-> Call API")
我在这里也遇到了问题。即使我添加了字符计数验证,只要执行此代码,Call API 就会打印到控制台。甚至没有键盘成为 textview 的第一响应者。
以 8 秒间隔触发的方法部分工作正常。再次,我找不到实现第三种方案的方法。
感谢任何帮助。
【问题讨论】:
【参考方案1】:要解决第一个问题,您需要过滤空字符串,而不是将它们映射到布尔值。
您已经正确地进行了节流。每 8 秒间隔最多为您提供一个事件。
现在,要仅在 10 秒内没有另一个事件跟随时触发一个事件,您需要使用 debounce 运算符。
最后,您将对这两个事件中的任何一个执行 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)
【讨论】:
非常感谢您的回答。虽然我找不到***merge
函数。我安装了 Bond v6.0.1。这atMostOncePer8Seconds.merge(with: on10SecondsAfterFinalEntry)
有效吗?
是的,是一样的。我想你可能需要import ReactiveKit
才能得到它。
哦,好的,谢谢。顺便说一句,我必须对您的代码进行一项更改。我不得不在textEntered
上调用debounce
函数,而不是text
。否则,即使在 textview 激活之前,API 调用仍会触发。以上是关于使用 Bond 定期触发方法的主要内容,如果未能解决你的问题,请参考以下文章
pygame.mixer.Sound.play 是不规则的,虽然定期触发
当手机状态为待机时,ActivityRecognitionClient requestActivityUpdates() 方法不会触发给定的 PendingIntent