这是一个用于重试操作的抽象类。其理念是提供一种简洁易用的方式来创建重试操作。例如,如果您执行一项获取网络资源的操作,该操作可能会因为当前没有互联网连接而失败。但是,互联网可能很快就会恢复!您可能不想通过告诉用户没有网络并且他们应该重试来打扰他们,而是可以等待几秒钟并重试请求。
重试操作类为您提供了一种轻松处理重试过程的方法。
注意:已取消的操作不会被重试。
RetryingOperation
是一个抽象类。要使用它,您必须对其进行子类化。
通常,在子类化Operation
时,如果您想编写异步操作,您要么子类化start()
、executing
、finished
和asynchronous
,要么只子类化main()
来进行同步操作。
要正确地子类化RetryingOperation
,您只需要子类化startBaseOperation()
和asynchronous
。在您的实现中,您负责启动您的操作,但您不必担心管理操作的executing
和finished
属性:这些属性会为您管理。
当您的操作完成时,您必须调用baseOperationEnded()
。您传递给此方法的参数将决定操作是否应该被重试以及重试延迟。即使操作由于被取消而完成也必须调用该方法(即使重试参数在操作被取消时被忽略)。事实上,如果您的操作是同步的,则必须在startBaseOperation()
返回之前调用该方法……
当您的操作正在等待重试时,您可以调用retryNow()
或retry(withHelpers:)
来绕过当前的重试助手,并立即重试或设置新的助手。注意:如果在调用这些方法时,基本操作已经在运行、从未启动或已完成,则不会执行任何操作,但会在日志中打印警告。
startBaseOperation()
和cancelBaseOperation()
将从同一个私有的GCD队列中调用。当您被调用时,不要对这些方法的线程做出任何其他假设。还要注意,您可能没有一个可用的运行循环。如果您正在编写异步操作,您必须尽快离开该方法,就像您在覆盖start()
时所做的那样。
使用场景:我正在使用一个框架,它提供了很好的操作。我想使这些操作可重试,但我不能让它们继承自RetryingOperation
,因为我不拥有它们。我该怎么办?
一种解决方案是使用RetryableOperationWrapper
。有关更多信息,请参阅此类的文档。
该项目最初由François Lamboley在happn工作时创建。