Повторите после задержки, если сигнал не будет отправлен в ReactiveCocoa 4

Я использую ReactiveCocoa 4.0 с Swift. У меня есть сигнал называется startedSignal типа Signal<String, NoError> что я подписываюсь в контроллере представления.

startedSignal.observeNext { _ in
  // Do stuff
}

Я в основном хочу подождать несколько секунд, а затем сделать что-то еще, если startedSignal не отправляет никаких следующих значений. Я посмотрел на документы и увидел такие вещи, как retry на SignalProducer но я не уверен, как это можно использовать для достижения этой цели, учитывая, что startedSignal не завершить или отправить ошибки.

2 ответа

Решение

В то время как Rex полезно, если у вас есть более сложные варианты использования, и вы не хотите реализовывать эту логику самостоятельно, вы можете сделать это с помощью существующих операторов в ReactiveCocoa, используя комбинацию timeoutWithError а также flatMapError или же retry:

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

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

Я думаю, что время ожидания Рекса - то, что вы хотите. Это будет выглядеть так:

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

startedSignal.timeoutAfter(1.0, event: alternative, onScheduler: UIScheduler()).observeNext { _ in
  // Do stuff
}
Другие вопросы по тегам