如果在ReactiveCocoa 4中未发送信号,则在延迟后重试

时间:2016-02-07 11:48:00

标签: swift reactive-cocoa reactive-cocoa-4

我正在使用ReactiveCocoa 4.0和Swift。我在视图控制器中订阅了startedSignal类型为Signal<String, NoError>的信号。

startedSignal.observeNext { _ in
  // Do stuff
}

我基本上想要等待几秒钟,然后在startedSignal未发送任何下一个值时执行其他操作。我查看了文档并在retry上查看了SignalProducer之类的内容,但我不确定如何使用startedSignal来完成或发送错误。< / p>

2 个答案:

答案 0 :(得分:5)

如果你有一些更高级的用例并且你不想自己实现这个逻辑,Rex很有用,你实际上可以使用ReactiveCocoa中的现有运算符来执行此操作timeoutWithErrorflatMapErrorretry的组合:

signal
   .promoteErrors(Error.self)
   .timeoutWithError(
      .Timeout, 
      afterInterval: interval,
      onScheduler: QueueScheduler()
   )
   .flatMapError { error in
      return anotherProducer
   }

  // Somewhere else:
  private enum Error: ErrorType {
    case Timeout
  }

答案 1 :(得分:3)

我认为Rex's timeout就是你想要的。它看起来像这样:

let alternative: Event<String, NoError> = ...

startedSignal.timeoutAfter(1.0, event: alternative, onScheduler: UIScheduler()).observeNext { _ in
  // Do stuff
}