如果 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
中的现有运算符来执行此操作,使用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
}
我在 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
中的现有运算符来执行此操作,使用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
}