使用 Bond 定期触发一个方法

Fire a method periodically using Bond

我是第一次在我的项目中使用 ReactiveKit 的 Bond 库并尝试掌握它。

在我的应用程序中,有一个文本视图。当用户输入时,API 调用需要分三个阶段触发。

  1. 只要输入第一个字符。
  2. 之后每 8 秒一次。
  3. 终于在用户键入最后一个字符 10 秒后出现一次。

我正在尝试看看我是否可以做到这一点。

textView.reactive.text
    .map { [=10=]!.characters.count > 0 }
    .throttle(seconds: 8)
    .observeNext { _ in
        print("-> Call API")
    }

我也遇到了问题。即使我添加了字符数验证,只要执行此代码,Call API 就会打印到控制台。没有键盘甚至成为文本视图的第一响应者。

以 8 秒间隔触发的方法工作正常。我再次找不到实现第三种情况的方法。

感谢任何帮助。

要解决第一个问题,您需要过滤空字符串,而不是将它们映射到布尔值。

您的节流设置正确。每 8 秒间隔最多给你一个事件。

现在,要仅在 10 秒内没有跟随另一个事件时才触发一个事件,您需要使用去抖动运算符。

最后,您将对这两个事件中的任何一个执行 API 调用,因此您必须合并信号才能接收这两个事件。

这是一个冗长的代码,不过您应该将其压缩:)

let text = textView.reactive.text.ignoreNil()
let textEntered = text.filter { ![=10=].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)
}