1

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

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

  1. 只要输入第一个字符。
  2. 之后每 8 秒。
  3. 终于在用户输入最后一个字符后 10 秒过去了。

我想看看我能不能做到这一点。

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

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

以 8 秒间隔触发的方法部分工作正常。同样,我找不到实现第三种情况的方法。

任何帮助表示赞赏。

4

1 回答 1

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)
}
于 2017-02-14T10:50:51.093 回答