Swift 为什么在retryWhen计时器结束时使用take(1)?
我在看电视Swift 为什么在retryWhen计时器结束时使用take(1)?,swift,timer,rx-swift,retry-logic,Swift,Timer,Rx Swift,Retry Logic,我在看电视 .retryWhen{中的错误 返回errors.enumerated().flatMap{(尝试,错误)->在 如果尝试次数>=最大尝试次数-1{ 返回可观察错误(error) } 返回可观察计时器(双精度(尝试+1),调度程序: MainScheduler.instance)。获取(1) } } 计时器没有使用周期变量,因此它只触发一次,不会重复。那么,它为什么要执行take(1)。在这本书的过程中,我看到这种情况发生了好几次。这里不需要take(1)take(1)将确保计时器
.retryWhen{中的错误
返回errors.enumerated().flatMap{(尝试,错误)->在
如果尝试次数>=最大尝试次数-1{
返回可观察错误(error)
}
返回可观察计时器(双精度(尝试+1),调度程序:
MainScheduler.instance)。获取(1)
}
}
计时器没有使用周期
变量,因此它只触发一次,不会重复。那么,它为什么要执行take(1)
。在这本书的过程中,我看到这种情况发生了好几次。这里不需要take(1)
take(1)
将确保计时器不会重复
可观察计时器是一个发出值的操作符。除非period
参数仍然是nil
,否则在这种情况下,将使用TimerOneOffSink
。TimerOneOffSink
发出元素,然后完成并处理
例如:
Observable<Int>
.timer(3.0,
scheduler: MainScheduler.instance)
.take(10)
.subscribe(
onNext: { print($0) },
onCompleted: { print("Completed") },
onDisposed: { print("Disposed") }
)
在咨询作者之一马林·托多罗夫(Marin Todorov)后,他确认这一定是疏忽
代码片段的整个思想是使用持续时间增加1秒的计时器在重试之间等待:结果是一个最大尝试次数的增量退避策略。如果您没有周期,那么它是不重复的。这难道不是不必要吗?@亲爱的,不是。所以教程很混乱。是吗?亲爱的,是的。在进行编辑之前,他们可能已经使用了interval
,使用take(1)
是有意义的。使用不重复的计时器使用take(1)
没有错,只是没有必要。你在推特上联系过他?FWIW,额外的take(1)
是关于retryWhen
的几个例子。不是一个单身汉犯了那个错误
Observable<Int>
.timer(3.0,
scheduler: MainScheduler.instance)
.take(10)
.subscribe(
onNext: { print($0) },
onCompleted: { print("Completed") },
onDisposed: { print("Disposed") }
)
0
Completed
Disposed