ExponentialBackOff 1.1.1

ExponentialBackOff 1.1.1

测试已测试
语言语言 SwiftSwift
许可 MIT
发布最后发布2017年1月
SwiftSwift 版本3.0
SPM支持 SPM

Koray Koska 维护。



  • 作者
  • Ybrin

ExponentialBackOff

描述

本框架实现了指数退避算法,在给定时间内重试代码,直到成功或超时时间到达。这对于应用程序中的网络功能可能很有用。

如果您想通过调用 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

要求

  • iOS 8.0+ / Mac OS X 10.9+
  • Xcode 7.2+
  • AsyncSwift 1.7+(Cocoapods将自动安装所有依赖项)

作者

Ybrin,[email protected]

许可

ExponentialBackOff可在MIT许可下使用。有关更多信息,请参阅LICENSE文件。