测试已测试 | ✗ |
语言语言 | SwiftSwift |
许可 | MIT |
发布最后发布 | 2017年1月 |
SwiftSwift 版本 | 3.0 |
SPM支持 SPM | ✗ |
由 Koray Koska 维护。
本框架实现了指数退避算法,在给定时间内重试代码,直到成功或超时时间到达。这对于应用程序中的网络功能可能很有用。
如果您想通过调用 API 请求刷新列表,您可能需要使用 Reachability 检查互联网连接可用性,如果未连接,您可以在一段时间后手动重新检查。
这正是此 API 发挥作用的时刻。它会以指数方式自动重复执行您的代码。
下一次尝试的等待时间计算如下
next_interval = retry_interval * (random value in range [1 - randomization_factor, 1 + randomization_factor])
此处.retry_interval 的计算方式如下
retry_interval = last_retry_interval * multiplier
如果是第一次重试,last_retry_interval 将设置为 initial_retry_interval
默认值如下
public static let DEFAULT_INITIAL_INTERVAL_MILLIS: Int = 500 // 0.5 seconds
public static let DEFAULT_MAX_ELAPSED_TIME_MILLIS: Int = 900000 // 15 minutes
public static let DEFAULT_MAX_INTERVAL_MILLIS: Int = 60000 // Intervall won't increase any more - 5 minutes
public static let DEFAULT_MULTIPLIER: Double = 1.5 // 1.5
public static let DEFAULT_RANDOMIZATION_FACTOR: Double = 0.5 // 0.5 or 50%
您可以将这些值中的任何更改您想要的值,但它们也是 Google Java API 库的默认值,例如用于请求 GCM 令牌。
ExponentialBackOff 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 中即可
pod "ExponentialBackOff"
基本使用非常简单直接。以下代码展示了如何使用框架的简单示例。
let builder = ExponentialBackOffInstance.Builder()
let exponentialBackOff = ExponentialBackOffInstance(builder: builder)
ExponentialBackOff.sharedInstance.runGeneralBackOff(exponentialBackOff) {
(lastIntervallMillis, elapsedTimeMillis, completion) in
print("Last interval: \(lastIntervallMillis)")
print("Elapsed time overall: \(elapsedTimeMillis)")
let randomNumber = arc4random_uniform(100)
if randomNumber == 28 {
print("Success! Terminating the back-off instance.")
completion(success: true)
} else {
print("Failed, retrying after some time.")
completion(success: false)
}
}
实际上这就够了。现在构建项目,坐等。如果您很幸运,它最终会打印出 成功。如果不是,它将在达到 Timeout(maxElapsedTimeMillis
)之前不断尝试。
注意:您的代码将在后台线程上执行,因此如果您必须在主线程上运行它,您应该将其包装在 AsyncSwift 中,如下所示:
Async.main {}
或如下所示:dispatch_async(dispatch_get_main_queue()) {}
。
如果您想更改一些默认值,您可以操作您的 Builder
的成员
let builder = ExponentialBackOffInstance.Builder()
builder.initialIntervalMillis = 2000
builder.maxElapsedTimeMillis = 100000
builder.maxIntervalMillis = 10000
builder.randomizationFactor = 0.2
builder.multiplier = 2.0
let exponentialBackOff = ExponentialBackOffInstance(builder: builder)
ExponentialBackOff.sharedInstance.runGeneralBackOff(exponentialBackOff) {
(lastIntervallMillis, elapsedTimeMillis, completion) in
// Last interval millis is never greater than maxIntervalMillis
print("Last interval: \(lastIntervallMillis)")
// If the elapsedTime exceeds maxElapsedTimeMillis the ExponentialBackOffInstance exits with
// BackOffState.Failed as the currentState
print("Elapsed time overall: \(elapsedTimeMillis)")
let randomNumber = arc4random_uniform(100)
if randomNumber == 97 {
print("Success! Terminating the back-off instance.")
completion(success: true)
} else {
print("Failed, retrying after some time.")
completion(success: false)
}
}
您可以从您的 ExponentialBackOffInstance 中读取一些值
let exponentialBackOff = ExponentialBackOffInstance(builder: builder)
.
.
.
if exponentialBackOff.currentState == .Failed {
exponentialBackOff.reset() // Restarts the back-off with the same code.
}
if exponentialBackOff.attempts >= 100 {
exponentialBackOff.stopExecution() // Stops the execution and sets currentState to BackOffState.Stopped
}
更多示例即将推出…
要运行示例项目,首先克隆仓库,然后在示例目录中运行pod install
。
Ybrin,[email protected]
ExponentialBackOff可在MIT许可下使用。有关更多信息,请参阅LICENSE文件。