使用 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 是不规则的,虽然定期触发

定期触发React效果

如何处理触发定期本地通知但时间表不断变化的应用程序?

如何定期运行在CDK中创建的Lambda?

当手机状态为待机时,ActivityRecognitionClient requestActivityUpdates() 方法不会触发给定的 PendingIntent

Webhook 加上定期付款