如果 ReactiveCocoa 4 中下一个信号没有发送,则在延迟后重试

Retry after delay if signal doesn't send next in ReactiveCocoa 4

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

startedSignal.observeNext { _ in
  // Do stuff
}

我基本上想等几秒钟,然后在 startedSignal 没有发送任何下一个值的情况下执行其他操作。我查看了文档并在 SignalProducer 上看到了类似 retry 的内容,但我不确定如何使用它来实现这一点,因为 startedSignal 没有完成或发送错误。

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

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

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

虽然 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
  }