Retry service provides policy for how often some operation should happen with the timeout limit and delay between events
The service creates sequence of the delays (nanoseconds) according to chosen strategy
There are two strategies
- constant - constant delay between retries
- exponential - Exponential backoff is a strategy in which you increase the delays between retries
/// Constant delay between retries
case constant(
retry : UInt = 5,
duration: DispatchTimeInterval,
timeout: DispatchTimeInterval
)
/// Exponential backoff is a strategy in which you increase the delays between retries
case exponential(
retry : UInt = 3,
multiplier: Double = 2.0, // power exponent
duration: DispatchTimeInterval,
timeout: DispatchTimeInterval
)
final class ViewModel : ObservableObject{
func constant() async {
let policy = RetryService(strategy: .constant())
for delay in policy{
try? await Task.sleep(nanoseconds: delay)
// do something
}
}
func exponential() async {
let policy = RetryService(
strategy: .exponential(
retry: 5,
multiplier: 2,
duration: .seconds(1),
timeout: .seconds(5)
)
)
for delay in policy{
try? await Task.sleep(nanoseconds: delay)
// do something
}
}
}
struct ContentView: View {
@StateObject var model = ViewModel()
var body: some View {
VStack {
Button("constatnt") { Task { await model.constant() } }
Button("exponential") { Task { await model.exponential() } }
}
.padding()
.task {
await model.exponential()
}
}
}