可重试任务 (RetryableTask)

RetryableTask 包含一个名为 withRetryableTask 的全局函数,该函数使用重试执行给定的操作。重试由给定的 RetryPolicy 确定。

以下示例将执行 consumeCoffee 函数直到成功,重试延迟为 100 毫秒,最多尝试 3 次。☕️

withRetryableTask(policy: DelayedRetryPolicy(delay: 100_000_000, maxRetries: 2)) {
    try consumeCoffee()
}

安装

使用 Swift Package Manager

…
dependencies: [
    .package(url: "https://github.com/rosecoder/retryable-task.git", from: "1.0.0"),
],
…
targets: [
    .target(name: "YourProduct", dependencies: [
        .product(name: "RetryableTask", package: "retryable-task")
    ]),
]

示例

设置默认策略

可以通过设置静态 DefaultRetryPolicy.retryPolicy 属性来设置默认策略。例如:

DefaultRetryPolicy.retryPolicy = DelayedRetryPolicy(delay: 100_000_000, maxRetries: 2)

这将为所有未定义策略的 withRetryableTask 调用使用新的默认重试策略。

使用 ImmediateRetryPolicy

ImmediateRetryPolicy 是一种重试策略,在每次重试之前立即执行(无延迟)。

示例

DefaultRetryPolicy.retryPolicy = ImmediateRetryPolicy(
    maxRetries: 5
)

这将执行操作最多 6 次,每次执行之间没有延迟。

使用 DelayedRetryPolicy

DelayedRetryPolicy 是一种重试策略,在每次重试之前具有静态延迟。

示例

DefaultRetryPolicy.retryPolicy = DelayedRetryPolicy(
    delay: 100_000_000,
    maxRetries: 5
)

这将执行操作最多 6 次,每次执行之间延迟 100 毫秒。

使用 ExponentialBackoffDelayRetryPolicy

ExponentialBackoffDelayRetryPolicy 是一种重试策略,在每次重试之前具有指数级增长的延迟。

示例

DefaultRetryPolicy.retryPolicy = ExponentialBackoffDelayRetryPolicy(
    minimumBackoffDelay: 100_000_000,
    maximumBackoffDelay: 400_000_000,
    maxRetries: 4
)

这将执行操作最多 5 次,延迟如下:

使用 NoRetryPolicy

NoRetryPolicy 是一种根本不重试的重试策略。这对于不应进行重试的单元测试非常有用。

例如,这可以在 XCTestCase 中设置:

class MyTests: XCTestCase {

    override func setUp() {
        super.setUp()

        DefaultRetryPolicy.retryPolicy = NoRetryPolicy()
    }
}