Skip to content
This repository was archived by the owner on Oct 29, 2021. It is now read-only.

Commit b0db092

Browse files
author
Alex Rupérez
committed
Retry requests
1 parent b8888d8 commit b0db092

File tree

11 files changed

+89
-29
lines changed

11 files changed

+89
-29
lines changed

Alamofire/NetAlamofire.swift

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,12 @@ public class NetAlamofire: Net {
2828

2929
open var responseInterceptors = [ResponseInterceptor]()
3030

31+
open var retryClosure: NetTask.RetryClosure? {
32+
didSet {
33+
sessionManager.retrier = self
34+
}
35+
}
36+
3137
open private(set) var sessionManager: Alamofire.SessionManager!
3238

3339
open var authChallenge: ((URLAuthenticationChallenge, (URLSession.AuthChallengeDisposition, URLCredential?) -> Swift.Void) -> Swift.Void)? {
@@ -114,3 +120,11 @@ extension NetAlamofire {
114120
}
115121

116122
}
123+
124+
extension NetAlamofire: RequestRetrier {
125+
126+
public func should(_ manager: SessionManager, retry request: Request, with error: Error, completion: @escaping RequestRetryCompletion) {
127+
completion(retryClosure?(netResponse(request.response), netError(error), request.retryCount) == true, 0)
128+
}
129+
130+
}

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
# Release 0.2.0
2+
3+
- [x] Retry requests
4+
15
# Release 0.1.3
26

37
- [x] Multipart form data encoder

Core/Net.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ public protocol Net: class {
2020

2121
var responseInterceptors: [ResponseInterceptor] { get set }
2222

23+
var retryClosure: NetTask.RetryClosure? { get set }
24+
2325
func addRequestInterceptor(_ interceptor: @escaping RequestInterceptor)
2426

2527
func addResponseInterceptor(_ interceptor: @escaping ResponseInterceptor)

Core/NetTask.swift

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ open class NetTask {
2828

2929
open let identifier: NetTaskIdentifier
3030

31-
open let request: NetRequest?
31+
open internal(set) var request: NetRequest?
3232

3333
open internal(set) var response: NetResponse? {
3434
didSet {
@@ -52,13 +52,17 @@ open class NetTask {
5252

5353
open internal(set) var metrics: NetTaskMetrics?
5454

55-
fileprivate let netTask: NetTaskProtocol?
55+
var netTask: NetTaskProtocol?
56+
57+
open internal(set) var retryCount: UInt = 0
5658

5759
fileprivate(set) var dispatchSemaphore: DispatchSemaphore?
5860

59-
fileprivate(set) var completionClosure: CompletionClosure?
61+
var completionClosure: CompletionClosure?
62+
63+
fileprivate(set) var retryClosure: RetryClosure?
6064

61-
fileprivate(set) var progressClosure: ProgressClosure?
65+
var progressClosure: ProgressClosure?
6266

6367
public init(_ identifier: NetTaskIdentifier? = nil, request: NetRequest? = nil , response: NetResponse? = nil, taskDescription: String? = nil, state: NetState = .suspended, error: NetError? = nil, priority: Float? = nil, progress: Progress? = nil, metrics: NetTaskMetrics? = nil, task: NetTaskProtocol? = nil) {
6468
self.request = request
@@ -77,6 +81,7 @@ open class NetTask {
7781
extension NetTask {
7882

7983
public typealias CompletionClosure = (NetResponse?, NetError?) -> Swift.Void
84+
public typealias RetryClosure = (NetResponse?, NetError?, UInt) -> Bool
8085

8186
@discardableResult open func async(_ completion: CompletionClosure? = nil) -> Self {
8287
guard state == .suspended else {
@@ -131,6 +136,11 @@ extension NetTask {
131136
throw taskError
132137
}
133138

139+
@discardableResult open func retry(_ retry: @escaping RetryClosure) -> Self {
140+
retryClosure = retry
141+
return self
142+
}
143+
134144
}
135145

136146
extension NetTask {

Net.xcodeproj/project.pbxproj

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1405,8 +1405,8 @@
14051405
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
14061406
CURRENT_PROJECT_VERSION = "$(DYLIB_CURRENT_VERSION)";
14071407
DEVELOPMENT_TEAM = 3VW789WSMP;
1408-
DYLIB_COMPATIBILITY_VERSION = 0.1.2;
1409-
DYLIB_CURRENT_VERSION = 0.1.3;
1408+
DYLIB_COMPATIBILITY_VERSION = 0.2.0;
1409+
DYLIB_CURRENT_VERSION = 0.2.0;
14101410
ENABLE_STRICT_OBJC_MSGSEND = YES;
14111411
ENABLE_TESTABILITY = YES;
14121412
GCC_C_LANGUAGE_STANDARD = gnu99;
@@ -1452,8 +1452,8 @@
14521452
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
14531453
CURRENT_PROJECT_VERSION = "$(DYLIB_CURRENT_VERSION)";
14541454
DEVELOPMENT_TEAM = 3VW789WSMP;
1455-
DYLIB_COMPATIBILITY_VERSION = 0.1.2;
1456-
DYLIB_CURRENT_VERSION = 0.1.3;
1455+
DYLIB_COMPATIBILITY_VERSION = 0.2.0;
1456+
DYLIB_CURRENT_VERSION = 0.2.0;
14571457
ENABLE_STRICT_OBJC_MSGSEND = YES;
14581458
GCC_C_LANGUAGE_STANDARD = gnu99;
14591459
GCC_NO_COMMON_BLOCKS = YES;

NetClient.podspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Pod::Spec.new do |s|
22
s.name = 'NetClient'
3-
s.version = '0.1.3'
3+
s.version = '0.2.0'
44
s.summary = 'Versatile HTTP networking library written in Swift 3.'
55

66
s.homepage = 'https://github.com/intelygenz/NetClient-iOS'

README.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
- [x] Asynchronous and synchronous task execution
2828
- [x] Inference of response object type
2929
- [x] Network reachability
30+
- [x] Retry requests
3031
- [x] watchOS Compatible
3132
- [x] tvOS Compatible
3233
- [x] macOS Compatible
@@ -163,6 +164,24 @@ net.addRequestInterceptor { request in
163164
}
164165
```
165166

167+
### Retry requests
168+
169+
```swift
170+
import Net
171+
172+
let net = NetURLSession()
173+
174+
net.retryClosure = { response, _, _ in response?.statusCode == XXX }
175+
176+
do {
177+
let task = try net.data("YOUR_URL").retry({ response, error, retryCount in
178+
return retryCount < 2
179+
}).sync()
180+
} catch {
181+
print("Error: \(error)")
182+
}
183+
```
184+
166185
### Love [Alamofire](https://github.com/Alamofire/Alamofire)?
167186

168187
```ruby

URLSession/NetURLSession+Data.swift

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,7 @@ extension NetURLSession {
1313
let task = session.dataTask(with: urlRequest(request)) { [weak self] (data, response, error) in
1414
let netResponse = self?.netResponse(response, netDataTask, data)
1515
let netError = self?.netError(error, data, response)
16-
netDataTask?.response = netResponse
17-
netDataTask?.error = netError
18-
netDataTask?.dispatchSemaphore?.signal()
19-
netDataTask?.completionClosure?(netResponse, netError)
16+
self?.process(netDataTask, netResponse, netError)
2017
}
2118
netDataTask = netTask(task, request)
2219
observe(task, netDataTask)

URLSession/NetURLSession+Download.swift

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,7 @@ extension NetURLSession {
1313
let task = session.downloadTask(withResumeData: resumeData) { [weak self] (url, response, error) in
1414
let netResponse = self?.netResponse(response, netDownloadTask, url)
1515
let netError = self?.netError(error, url, response)
16-
netDownloadTask?.response = netResponse
17-
netDownloadTask?.error = netError
18-
netDownloadTask?.dispatchSemaphore?.signal()
19-
netDownloadTask?.completionClosure?(netResponse, netError)
16+
self?.process(netDownloadTask, netResponse, netError)
2017
}
2118
netDownloadTask = netTask(task)
2219
observe(task, netDownloadTask)
@@ -28,10 +25,7 @@ extension NetURLSession {
2825
let task = session.downloadTask(with: urlRequest(request)) { [weak self] (url, response, error) in
2926
let netResponse = self?.netResponse(response, netDownloadTask, url)
3027
let netError = self?.netError(error, url, response)
31-
netDownloadTask?.response = netResponse
32-
netDownloadTask?.error = netError
33-
netDownloadTask?.dispatchSemaphore?.signal()
34-
netDownloadTask?.completionClosure?(netResponse, netError)
28+
self?.process(netDownloadTask, netResponse, netError)
3529
}
3630
netDownloadTask = netTask(task, request)
3731
observe(task, netDownloadTask)

URLSession/NetURLSession+Upload.swift

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,7 @@ extension NetURLSession {
3838
let task = session.uploadTask(with: urlRequest(request), from: data) { [weak self] (data, response, error) in
3939
let netResponse = self?.netResponse(response, netUploadTask, data)
4040
let netError = self?.netError(error, data, response)
41-
netUploadTask?.response = netResponse
42-
netUploadTask?.error = netError
43-
netUploadTask?.dispatchSemaphore?.signal()
44-
netUploadTask?.completionClosure?(netResponse, netError)
41+
self?.process(netUploadTask, netResponse, netError)
4542
}
4643
netUploadTask = netTask(task, request)
4744
observe(task, netUploadTask)
@@ -71,10 +68,7 @@ extension NetURLSession {
7168
let task = session.uploadTask(with: urlRequest(request), fromFile: fileURL) { [weak self] (data, response, error) in
7269
let netResponse = self?.netResponse(response, netUploadTask, data)
7370
let netError = self?.netError(error, data, response)
74-
netUploadTask?.response = netResponse
75-
netUploadTask?.error = netError
76-
netUploadTask?.dispatchSemaphore?.signal()
77-
netUploadTask?.completionClosure?(netResponse, netError)
71+
self?.process(netUploadTask, netResponse, netError)
7872
}
7973
netUploadTask = netTask(task, request)
8074
observe(task, netUploadTask)

0 commit comments

Comments
 (0)