使用Bond

时间:2017-02-14 09:56:39

标签: ios swift reactive-programming reactivekit swiftbond

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

在我的应用中,有一个textview。当用户输入时,API调用需要在三个阶段触发。

  1. 输入第一个字符后。
  2. 之后每8秒钟。
  3. 自用户输入最后一个字符后,最后一次超过10秒。
  4. 我试图看看能不能做到这一点。

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

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

    以8秒间隔射击的方法部分工作正常。再一次,我无法找到实现第三种情况的方法。

    感谢任何帮助。

1 个答案:

答案 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)
}