Skip to content

Commit f6c59dc

Browse files
committed
Cancel url session task when http net task is canceled. Fixed #3.
1 parent 840c19f commit f6c59dc

File tree

5 files changed

+40
-0
lines changed

5 files changed

+40
-0
lines changed

STNetTaskQueue/STHTTPNetTask.m

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,12 @@
1414
NSString *const STHTTPNetTaskErrorResponseDataUserInfoKey = @"responseData";
1515
NSString *STHTTPNetTaskRequestObjectDefaultSeparator = @"_";
1616

17+
@interface STHTTPNetTask ()
18+
19+
@property (nonatomic, strong) NSURLSessionTask *sessionTask;
20+
21+
@end
22+
1723
@implementation STHTTPNetTask
1824

1925
- (STHTTPNetTaskMethod)method

STNetTaskQueue/STHTTPNetTaskQueueHandler.m

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,9 +207,22 @@ - (void)netTaskQueue:(STNetTaskQueue *)netTaskQueue handleTask:(STNetTask *)task
207207
break;
208208
}
209209

210+
[httpTask setValue:sessionTask forKey:@"sessionTask"];
210211
[sessionTask resume];
211212
}
212213

214+
- (void)netTaskQueue:(STNetTaskQueue *)netTaskQueue didCancelTask:(STNetTask *)task
215+
{
216+
NSAssert([task isKindOfClass:[STHTTPNetTask class]], @"Net task should be subclass of STHTTPNetTask");
217+
218+
STHTTPNetTask *httpTask = (STHTTPNetTask *)task;
219+
220+
NSURLSessionTask *sessionTask = [httpTask valueForKey:@"sessionTask"];
221+
[sessionTask cancel];
222+
223+
[httpTask setValue:nil forKey:@"sessionTask"];
224+
}
225+
213226
- (NSString *)queryStringFromParameters:(NSDictionary *)parameters
214227
{
215228
if (!parameters.count) {

STNetTaskQueue/STNetTaskQueue.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
@protocol STNetTaskQueueHandler <NSObject>
1515

1616
- (void)netTaskQueue:(STNetTaskQueue *)netTaskQueue handleTask:(STNetTask *)task;
17+
- (void)netTaskQueue:(STNetTaskQueue *)netTaskQueue didCancelTask:(STNetTask *)task;
1718

1819
@end
1920

STNetTaskQueue/STNetTaskQueue.m

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,8 @@ - (void)_cancelTask:(STNetTask *)task
9797
[self.tasks removeObject:task];
9898
[self.watingTasks removeObject:task];
9999
task.pending = NO;
100+
101+
[self.handler netTaskQueue:self didCancelTask:task];
100102
}
101103

102104
- (BOOL)_retryTask:(STNetTask *)task withError:(NSError *)error

STNetTaskQueueTest/STNetTaskQueueTest/STNetTaskQueueTestHTTP.m

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,24 @@ - (void)testRetryNetTask
5656
[self waitForExpectationsWithTimeout:10 handler:nil];
5757
}
5858

59+
- (void)testCancelNetTask
60+
{
61+
[self setUpNetTaskQueueWithBaseURLString:@"http://jsonplaceholder.typicode.com"];
62+
63+
_expectation = [self expectationWithDescription:@"testRetryNetTask"];
64+
65+
STTestRetryNetTask *testRetryTask = [STTestRetryNetTask new];
66+
[[STNetTaskQueue sharedQueue] addTaskDelegate:self uri:testRetryTask.uri];
67+
[[STNetTaskQueue sharedQueue] addTask:testRetryTask];
68+
69+
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
70+
[[STNetTaskQueue sharedQueue] cancelTask:testRetryTask];
71+
[_expectation fulfill];
72+
});
73+
74+
[self waitForExpectationsWithTimeout:10 handler:nil];
75+
}
76+
5977
- (void)testGetNetTask
6078
{
6179
[self setUpNetTaskQueueWithBaseURLString:@"http://jsonplaceholder.typicode.com"];

0 commit comments

Comments
 (0)