重试操作

Platforms SPM compatible License happn

这是什么?

这是一个用于重试操作的抽象类。其理念是提供一种简洁易用的方式来创建重试操作。例如,如果您执行一项获取网络资源的操作,该操作可能会因为当前没有互联网连接而失败。但是,互联网可能很快就会恢复!您可能不想通过告诉用户没有网络并且他们应该重试来打扰他们,而是可以等待几秒钟并重试请求。

重试操作类为您提供了一种轻松处理重试过程的方法。

注意:已取消的操作不会被重试。

如何使用它?

RetryingOperation是一个抽象类。要使用它,您必须对其进行子类化。

通常,在子类化Operation时,如果您想编写异步操作,您要么子类化start()executingfinishedasynchronous,要么只子类化main()来进行同步操作。

要正确地子类化RetryingOperation,您只需要子类化startBaseOperation()asynchronous。在您的实现中,您负责启动您的操作,但您不必担心管理操作的executingfinished属性:这些属性会为您管理。

当您的操作完成时,您必须调用baseOperationEnded()。您传递给此方法的参数将决定操作是否应该被重试以及重试延迟。即使操作由于被取消而完成也必须调用该方法(即使重试参数在操作被取消时被忽略)。事实上,如果您的操作是同步的,则必须在startBaseOperation()返回之前调用该方法……

当您的操作正在等待重试时,您可以调用retryNow()retry(withHelpers:)来绕过当前的重试助手,并立即重试或设置新的助手。注意:如果在调用这些方法时,基本操作已经在运行、从未启动或已完成,则不会执行任何操作,但会在日志中打印警告。

startBaseOperation()cancelBaseOperation()将从同一个私有的GCD队列中调用。当您被调用时,不要对这些方法的线程做出任何其他假设。还要注意,您可能没有一个可用的运行循环。如果您正在编写异步操作,您必须尽快离开该方法,就像您在覆盖start()时所做的那样。

对于我不拥有的操作怎么办?

使用场景:我正在使用一个框架,它提供了很好的操作。我想使这些操作可重试,但我不能让它们继承自RetryingOperation,因为我不拥有它们。我该怎么办?

一种解决方案是使用RetryableOperationWrapper。有关更多信息,请参阅此类的文档。

鸣谢

该项目最初由François Lamboleyhappn工作时创建。