Skip to content

Commit c3483c5

Browse files
committed
Support retrying net task if error is encountered.
1 parent bcb0163 commit c3483c5

9 files changed

Lines changed: 542 additions & 0 deletions

File tree

STNetTaskQueue/STNetTask.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,14 @@
1212

1313
@property (nonatomic, strong) NSError *error;
1414
@property (nonatomic, assign) BOOL pending;
15+
@property (nonatomic, assign) NSUInteger retryCount;
1516

1617
- (NSString *)uri;
1718
- (void)didResponse:(NSObject *)response;
1819
- (void)didFail;
20+
- (void)didRetry;
21+
22+
- (NSUInteger)maxRetryCount;
23+
- (BOOL)shouldRetryForError:(NSError *)error;
1924

2025
@end

STNetTaskQueue/STNetTask.m

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,19 @@ - (void)didFail
2525

2626
}
2727

28+
- (void)didRetry
29+
{
30+
31+
}
32+
33+
- (NSUInteger)maxRetryCount
34+
{
35+
return 0;
36+
}
37+
38+
- (BOOL)shouldRetryForError:(NSError *)error
39+
{
40+
return YES;
41+
}
42+
2843
@end

STNetTaskQueue/STNetTaskQueue.m

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,17 @@ - (void)cancelTask:(STNetTask *)task
9696
}];
9797
}
9898

99+
- (BOOL)retryTask:(STNetTask *)task error:(NSError *)error
100+
{
101+
if ([task shouldRetryForError:error] && task.retryCount < task.maxRetryCount) {
102+
task.retryCount++;
103+
[task didRetry];
104+
[self addTask:task];
105+
return YES;
106+
}
107+
return NO;
108+
}
109+
99110
- (void)didResponse:(NSObject *)response taskId:(int)taskId
100111
{
101112
__weak STNetTaskQueue *weakSelf = self;
@@ -118,7 +129,13 @@ - (void)didResponse:(NSObject *)response taskId:(int)taskId
118129
NSError *error = [NSError errorWithDomain:STNetTaskQueueErrorUnknown
119130
code:-1
120131
userInfo:@{ @"msg": @"Unknown Error" }];
132+
133+
if ([self retryTask:task error:error]) {
134+
return;
135+
}
136+
121137
task.error = error;
138+
[task didFail];
122139
}
123140

124141
[weakSelf netTaskDidEnd:task];
@@ -142,6 +159,10 @@ - (void)didFailWithError:(NSError *)error taskId:(int)taskId
142159
[weakSelf.tasks removeObjectForKey:@(taskId)];
143160
}
144161

162+
if ([self retryTask:task error:error]) {
163+
return;
164+
}
165+
145166
task.error = error;
146167
[task didFail];
147168
[weakSelf netTaskDidEnd:task];

STNetTaskQueueTest/STNetTaskQueueTest.xcodeproj/project.pbxproj

Lines changed: 372 additions & 0 deletions
Large diffs are not rendered by default.

STNetTaskQueueTest/STNetTaskQueueTest.xcodeproj/project.xcworkspace/contents.xcworkspacedata

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3+
<plist version="1.0">
4+
<dict>
5+
<key>CFBundleDevelopmentRegion</key>
6+
<string>en</string>
7+
<key>CFBundleExecutable</key>
8+
<string>$(EXECUTABLE_NAME)</string>
9+
<key>CFBundleIdentifier</key>
10+
<string>me.sth4.$(PRODUCT_NAME:rfc1034identifier)</string>
11+
<key>CFBundleInfoDictionaryVersion</key>
12+
<string>6.0</string>
13+
<key>CFBundleName</key>
14+
<string>$(PRODUCT_NAME)</string>
15+
<key>CFBundlePackageType</key>
16+
<string>BNDL</string>
17+
<key>CFBundleShortVersionString</key>
18+
<string>1.0</string>
19+
<key>CFBundleSignature</key>
20+
<string>????</string>
21+
<key>CFBundleVersion</key>
22+
<string>1</string>
23+
</dict>
24+
</plist>
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
//
2+
// STNetTaskQueueTest.m
3+
// STNetTaskQueueTest
4+
//
5+
// Created by Kevin Lin on 14/7/15.
6+
//
7+
//
8+
9+
#import <UIKit/UIKit.h>
10+
#import <XCTest/XCTest.h>
11+
#import "STHTTPNetTaskQueueHandler.h"
12+
#import "STTestRetryNetTask.h"
13+
14+
@interface STNetTaskQueueTest : XCTestCase <STNetTaskDelegate>
15+
16+
@end
17+
18+
@implementation STNetTaskQueueTest
19+
{
20+
XCTestExpectation *_expectation;
21+
}
22+
23+
- (void)setUp
24+
{
25+
[super setUp];
26+
27+
STHTTPNetTaskQueueHandler *httpHandler = [[STHTTPNetTaskQueueHandler alloc] initWithBaseURL:[NSURL URLWithString:@"https://www.google.com"]];
28+
[STNetTaskQueue sharedQueue].handler = httpHandler;
29+
}
30+
31+
- (void)tearDown
32+
{
33+
[super tearDown];
34+
}
35+
36+
- (void)testRetryNetTask
37+
{
38+
_expectation = [self expectationWithDescription:@"testRetryNetTask"];
39+
40+
STTestRetryNetTask *testRetryTask = [STTestRetryNetTask new];
41+
[[STNetTaskQueue sharedQueue] addTaskDelegate:self uri:testRetryTask.uri];
42+
[[STNetTaskQueue sharedQueue] addTask:testRetryTask];
43+
44+
[self waitForExpectationsWithTimeout:10 handler:nil];
45+
}
46+
47+
- (void)netTaskDidEnd:(STNetTask *)task
48+
{
49+
if ([task isKindOfClass:[STTestRetryNetTask class]]) {
50+
[_expectation fulfill];
51+
if (task.retryCount != task.maxRetryCount) {
52+
XCTFail(@"testRetryNetTask failed");
53+
}
54+
}
55+
}
56+
57+
@end
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
//
2+
// STTestRetryNetTask.h
3+
// STNetTaskQueueTest
4+
//
5+
// Created by Kevin Lin on 14/7/15.
6+
//
7+
//
8+
9+
#import "STHTTPNetTask.h"
10+
11+
@interface STTestRetryNetTask : STHTTPNetTask
12+
13+
@end
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
//
2+
// STTestRetryNetTask.m
3+
// STNetTaskQueueTest
4+
//
5+
// Created by Kevin Lin on 14/7/15.
6+
//
7+
//
8+
9+
#import "STTestRetryNetTask.h"
10+
11+
@implementation STTestRetryNetTask
12+
13+
- (NSString *)uri
14+
{
15+
return @"nonexist_uri";
16+
}
17+
18+
- (void)didRetry
19+
{
20+
NSLog(@"retryCount: %ld", self.retryCount);
21+
}
22+
23+
- (NSUInteger)maxRetryCount
24+
{
25+
return 5;
26+
}
27+
28+
@end

0 commit comments

Comments
 (0)