Skip to content

Commit 595b204

Browse files
committed
Added -subscribeState:usingBlock:
1 parent 3193b7d commit 595b204

File tree

4 files changed

+79
-0
lines changed

4 files changed

+79
-0
lines changed

STNetTaskQueue/STNetTask.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ FOUNDATION_EXPORT NSString *const STNetTaskUnknownError;
2323
}]; \
2424
return nil; \
2525
}]
26+
2627
#endif
2728

2829
@class STNetTask;
@@ -39,6 +40,14 @@ FOUNDATION_EXPORT NSString *const STNetTaskUnknownError;
3940

4041
@end
4142

43+
typedef NS_ENUM(NSUInteger, STNetTaskState) {
44+
STNetTaskStateCancalled,
45+
STNetTaskStateFinished,
46+
STNetTaskStateRetrying
47+
};
48+
49+
typedef void (^STNetTaskSubscriptionBlock)(STNetTask *task);
50+
4251
@interface STNetTask : NSObject
4352

4453
/* Error object which contains error message when net task is failed. */
@@ -71,18 +80,21 @@ FOUNDATION_EXPORT NSString *const STNetTaskUnknownError;
7180

7281
/*
7382
A callback method which is called when the net task is finished successfully.
83+
Note: this method will be called in thread of STNetTaskQueue.
7484
7585
@param response id The response object.
7686
*/
7787
- (void)didResponse:(id)response;
7888

7989
/*
8090
A callback method which is called when the net task is failed.
91+
Note: this method will be called in thread of STNetTaskQueue.
8192
*/
8293
- (void)didFail;
8394

8495
/*
8596
A callback method which is called when the net task is retried.
97+
Note: this method will be called in thread of STNetTaskQueue.
8698
*/
8799
- (void)didRetry;
88100

@@ -110,4 +122,13 @@ FOUNDATION_EXPORT NSString *const STNetTaskUnknownError;
110122
*/
111123
- (NSTimeInterval)retryInterval;
112124

125+
/*
126+
Subscribe state of net task by using block
127+
128+
@param state STNetTaskState state of net task
129+
@param block STNetTaskSubscriptionBlock block is called when net task is in subscribed state.
130+
NOTE: this block will be called in main thread.
131+
*/
132+
- (void)subscribeState:(STNetTaskState)state usingBlock:(STNetTaskSubscriptionBlock)block;
133+
113134
@end

STNetTaskQueue/STNetTask.m

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ @interface STNetTask ()
1616
@property (atomic, assign) BOOL cancelled;
1717
@property (atomic, assign) BOOL finished;
1818
@property (atomic, assign) NSUInteger retryCount;
19+
@property (nonatomic, strong) NSMutableDictionary *stateToBlock;
1920

2021
@end
2122

@@ -56,4 +57,33 @@ - (NSTimeInterval)retryInterval
5657
return 0;
5758
}
5859

60+
- (void)subscribeState:(STNetTaskState)state usingBlock:(STNetTaskSubscriptionBlock)block
61+
{
62+
if (!self.stateToBlock) {
63+
self.stateToBlock = [NSMutableDictionary new];
64+
}
65+
NSAssert(self.stateToBlock[@(state)] == nil, @"State is subscribed already");
66+
self.stateToBlock[@(state)] = [block copy];
67+
}
68+
69+
- (void)notifyState:(STNetTaskState)state
70+
{
71+
dispatch_async(dispatch_get_main_queue(), ^{
72+
STNetTaskSubscriptionBlock block = self.stateToBlock[@(state)];
73+
if (block) {
74+
block(self);
75+
}
76+
77+
switch (state) {
78+
case STNetTaskStateFinished:
79+
case STNetTaskStateCancalled: {
80+
self.stateToBlock = nil;
81+
}
82+
break;
83+
default:
84+
break;
85+
}
86+
});
87+
}
88+
5989
@end

STNetTaskQueue/STNetTaskQueue.m

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ @interface STNetTask (STInternal)
1616
@property (atomic, assign) BOOL finished;
1717
@property (atomic, assign) NSUInteger retryCount;
1818

19+
- (void)notifyState:(STNetTaskState)state;
20+
1921
@end
2022

2123
@interface STNetTaskQueue()
@@ -120,6 +122,7 @@ - (void)_cancelTask:(STNetTask *)task
120122

121123
[self.handler netTaskQueue:self didCancelTask:task];
122124
task.cancelled = YES;
125+
[task notifyState:STNetTaskStateCancalled];
123126
}
124127

125128
- (BOOL)_retryTask:(STNetTask *)task withError:(NSError *)error
@@ -136,6 +139,7 @@ - (void)_retryTask:(STNetTask *)task
136139
{
137140
if (!task.cancelled) {
138141
[task didRetry];
142+
[task notifyState:STNetTaskStateRetrying];
139143
[self addTask:task];
140144
}
141145
}
@@ -183,6 +187,7 @@ - (void)_task:(STNetTask *)task didResponse:(id)response
183187

184188
task.pending = NO;
185189
task.finished = YES;
190+
[task notifyState:STNetTaskStateFinished];
186191

187192
[self _netTaskDidEnd:task];
188193

@@ -213,6 +218,7 @@ - (void)_task:(STNetTask *)task didFailWithError:(NSError *)error
213218
[task didFail];
214219
task.pending = NO;
215220
task.finished = YES;
221+
[task notifyState:STNetTaskStateFinished];
216222

217223
[self _netTaskDidEnd:task];
218224

STNetTaskQueueTest/STNetTaskQueueTest/STNetTaskQueueTestHTTP.m

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,28 @@ - (void)testTaskDelegateForClass
185185
[self waitForExpectationsWithTimeout:10 handler:nil];
186186
}
187187

188+
- (void)testSubscriptionBlock
189+
{
190+
[self setUpNetTaskQueueWithBaseURLString:@"http://jsonplaceholder.typicode.com"];
191+
192+
_expectation = [self expectationWithDescription:@"testSubscriptionBlock"];
193+
194+
STTestGetNetTask *testGetTask = [STTestGetNetTask new];
195+
testGetTask.id = 1;
196+
[[STNetTaskQueue sharedQueue] addTask:testGetTask];
197+
198+
[testGetTask subscribeState:STNetTaskStateFinished usingBlock:^(STNetTask *task) {
199+
if (task.finished) {
200+
[_expectation fulfill];
201+
}
202+
else {
203+
XCTFail(@"%@ failed", _expectation.description);
204+
}
205+
}];
206+
207+
[self waitForExpectationsWithTimeout:10 handler:nil];
208+
}
209+
188210
- (void)netTaskDidEnd:(STNetTask *)task
189211
{
190212
if (!_expectation) {

0 commit comments

Comments
 (0)