Skip to content

Instantly share code, notes, and snippets.

@daljeetseera
Last active July 28, 2021 04:55
Show Gist options
  • Save daljeetseera/7ce2b53b8a88d8a5e9b172c0495c6455 to your computer and use it in GitHub Desktop.
Save daljeetseera/7ce2b53b8a88d8a5e9b172c0495c6455 to your computer and use it in GitHub Desktop.
Network request retrier for Alamofire
import Alamofire
class NetworkRequestRetrier: RequestRetrier {
let retry = 3 // set the count for number of retries
// [Request url: Number of times retried]
private var retriedRequests: [String: Int] = [:]
func should(_ manager: SessionManager,
retry request: Request,
with error: Error,
completion: @escaping RequestRetryCompletion) {
guard
request.task?.response == nil,
let url = request.request?.url?.absoluteString
else {
removeCachedUrlRequest(url: request.request?.url?.absoluteString)
completion(false, 0.0) // don't retry
return
}
let errorGenerated = error as NSError
switch errorGenerated.code {
case NetworkErrorCode.timeOut.rawValue, NetworkErrorCode.connectionLost.rawValue :
guard let retryCount = retriedRequests[url] else {
retriedRequests[url] = 1
completion(true, 0.5) // retry after 0.5 second
return
}
if retryCount < retry { // check remaining retries available
retriedRequests[url] = retryCount + 1
completion(true, 0.5) // retry after 0.5 second
} else {
removeCachedUrlRequest(url: url)
completion(false, 0.0) // don't retry
}
default:
removeCachedUrlRequest(url: url)
completion(false, 0.0)
}
}
// removes requests completed
private func removeCachedUrlRequest(url: String?) {
guard let url = url else {
return
}
retriedRequests.removeValue(forKey: url)
}
}
@nitrag
Copy link

nitrag commented Jul 28, 2021

Seems you have some other custom class? Cannot find 'NetworkErrorCode' in scope

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment