Last active
July 28, 2021 04:55
-
-
Save daljeetseera/7ce2b53b8a88d8a5e9b172c0495c6455 to your computer and use it in GitHub Desktop.
Network request retrier for Alamofire
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Seems you have some other custom class?
Cannot find 'NetworkErrorCode' in scope