Skip to content

Commit 04533af

Browse files
committed
Support delegate for class.
1 parent 2e38c9f commit 04533af

File tree

3 files changed

+71
-16
lines changed

3 files changed

+71
-16
lines changed

STNetTaskQueue/STNetTaskQueue.h

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,14 +91,23 @@
9191
- (void)task:(STNetTask *)task didFailWithError:(NSError *)error;
9292

9393
/*
94-
Add a net task delegate to "STNetTaskQueue",
94+
Add a net task delegate to "STNetTaskQueue" with uri of the net task,
9595
it's a weak reference and duplicated delegate with same uri will be ignored.
9696
9797
@param delegate id<STNetTaskDelegate>
9898
@param uri NSString A unique string returned by STNetTask.
9999
*/
100100
- (void)addTaskDelegate:(id<STNetTaskDelegate>)delegate uri:(NSString *)uri;
101101

102+
/*
103+
Add a net task delegate to "STNetTaskQueue" with class of net task,
104+
it's a weak reference and duplicated delegate with same class will be ignored.
105+
106+
@param delegate id<STNetTaskDelegate>
107+
@param class Class Class which extends STNetTask.
108+
*/
109+
- (void)addTaskDelegate:(id<STNetTaskDelegate>)delegate class:(Class)class;
110+
102111
/*
103112
Most of the times you don't need to remove net task delegate explicitly,
104113
because "STNetTaskQueue" holds weak reference of each delegate.
@@ -107,6 +116,7 @@
107116
@param uri NSString
108117
*/
109118
- (void)removeTaskDelegate:(id<STNetTaskDelegate>)delegate uri:(NSString *)uri;
119+
- (void)removeTaskDelegate:(id<STNetTaskDelegate>)delegate class:(Class)class;
110120
- (void)removeTaskDelegate:(id<STNetTaskDelegate>)delegate;
111121

112122
@end

STNetTaskQueue/STNetTaskQueue.m

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -214,14 +214,18 @@ - (void)_netTaskDidEnd:(STNetTask *)task
214214
{
215215
[self.lock lock];
216216

217-
NSHashTable *delegates = self.taskDelegates[task.uri];
218-
NSArray *allDelegates = [NSArray arrayWithArray:delegates.allObjects];
217+
NSHashTable *delegatesForURI = self.taskDelegates[task.uri];
218+
NSHashTable *delegatesForClass = self.taskDelegates[NSStringFromClass(task.class)];
219+
NSMutableSet *set = [NSMutableSet new];
220+
[set addObjectsFromArray:delegatesForURI.allObjects];
221+
[set addObjectsFromArray:delegatesForClass.allObjects];
222+
NSArray *delegates = set.allObjects;
219223

220224
[self.lock unlock];
221225

222-
if (allDelegates.count) {
226+
if (delegates.count) {
223227
dispatch_async(dispatch_get_main_queue(), ^ {
224-
for (id<STNetTaskDelegate> delegate in allDelegates) {
228+
for (id<STNetTaskDelegate> delegate in delegates) {
225229
[delegate netTaskDidEnd:task];
226230
}
227231
});
@@ -242,22 +246,49 @@ - (void)addTaskDelegate:(id<STNetTaskDelegate>)delegate uri:(NSString *)uri
242246
[self.lock unlock];
243247
}
244248

249+
- (void)addTaskDelegate:(id<STNetTaskDelegate>)delegate class:(Class)class
250+
{
251+
NSString *className = NSStringFromClass(class);
252+
NSAssert([class isSubclassOfClass:[STNetTask class]], @"%@ should be a subclass of STNetTask", className);
253+
254+
[self.lock lock];
255+
256+
NSHashTable *delegates = self.taskDelegates[className];
257+
if (!delegates) {
258+
delegates = [NSHashTable weakObjectsHashTable];
259+
self.taskDelegates[className] = delegates;
260+
}
261+
[delegates addObject:delegate];
262+
263+
[self.lock unlock];
264+
}
265+
245266
- (void)removeTaskDelegate:(id<STNetTaskDelegate>)delegate
246267
{
247268
[self.lock lock];
248269

249-
for (NSString *uri in self.taskDelegates) {
250-
[self removeTaskDelegate:delegate uri:uri];
270+
for (NSString *key in self.taskDelegates) {
271+
[self removeTaskDelegate:delegate key:key];
251272
}
252273

253274
[self.lock unlock];
254275
}
255276

256277
- (void)removeTaskDelegate:(id<STNetTaskDelegate>)delegate uri:(NSString *)uri
278+
{
279+
[self removeTaskDelegate:delegate key:uri];
280+
}
281+
282+
- (void)removeTaskDelegate:(id<STNetTaskDelegate>)delegate class:(Class)class
283+
{
284+
[self removeTaskDelegate:delegate key:NSStringFromClass(class)];
285+
}
286+
287+
- (void)removeTaskDelegate:(id<STNetTaskDelegate>)delegate key:(NSString *)key
257288
{
258289
[self.lock lock];
259290

260-
NSHashTable *delegates = self.taskDelegates[uri];
291+
NSHashTable *delegates = self.taskDelegates[key];
261292
[delegates removeObject:delegate];
262293

263294
[self.lock unlock];

STNetTaskQueueTest/STNetTaskQueueTest/STNetTaskQueueTestHTTP.m

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -152,11 +152,11 @@ - (void)testDeleteNetTask
152152

153153
- (void)testMaxConcurrentTasksCountTask
154154
{
155-
_expectation = [self expectationWithDescription:@"testMaxConcurrentTasksCount"];
156-
157155
[self setUpNetTaskQueueWithBaseURLString:@"http://jsonplaceholder.typicode.com"];
158156
[STNetTaskQueue sharedQueue].maxConcurrentTasksCount = 1;
159157

158+
_expectation = [self expectationWithDescription:@"testMaxConcurrentTasksCount"];
159+
160160
STTestMaxConcurrentTasksCountNetTask *task1 = [STTestMaxConcurrentTasksCountNetTask new];
161161
task1.id = 1;
162162

@@ -171,6 +171,20 @@ - (void)testMaxConcurrentTasksCountTask
171171
[self waitForExpectationsWithTimeout:20 handler:nil];
172172
}
173173

174+
- (void)testTaskDelegateForClass
175+
{
176+
[self setUpNetTaskQueueWithBaseURLString:@"http://jsonplaceholder.typicode.com"];
177+
178+
_expectation = [self expectationWithDescription:@"testTaskDelegateForClass"];
179+
180+
STTestGetNetTask *testGetTask = [STTestGetNetTask new];
181+
testGetTask.id = 1;
182+
[[STNetTaskQueue sharedQueue] addTaskDelegate:self class:testGetTask.class];
183+
[[STNetTaskQueue sharedQueue] addTask:testGetTask];
184+
185+
[self waitForExpectationsWithTimeout:10 handler:nil];
186+
}
187+
174188
- (void)netTaskDidEnd:(STNetTask *)task
175189
{
176190
if (!_expectation) {
@@ -179,14 +193,14 @@ - (void)netTaskDidEnd:(STNetTask *)task
179193
if ([task isKindOfClass:[STTestRetryNetTask class]]) {
180194
[_expectation fulfill];
181195
if (!task.error || task.retryCount != task.maxRetryCount) {
182-
XCTFail(@"testRetryNetTask failed");
196+
XCTFail(@"%@ failed", _expectation.description);
183197
}
184198
}
185199
else if ([task isKindOfClass:[STTestGetNetTask class]]) {
186200
[_expectation fulfill];
187201
STTestGetNetTask *testGetTask = (STTestGetNetTask *)task;
188202
if (task.error || [testGetTask.post[@"id"] intValue] != testGetTask.id) {
189-
XCTFail(@"testGetNetTask failed");
203+
XCTFail(@"%@ failed", _expectation.description);
190204
}
191205
}
192206
else if ([task isKindOfClass:[STTestPostNetTask class]]) {
@@ -196,27 +210,27 @@ - (void)netTaskDidEnd:(STNetTask *)task
196210
![testPostTask.post[@"title"] isEqualToString:testPostTask.title] ||
197211
![testPostTask.post[@"body"] isEqualToString:testPostTask.body] ||
198212
[testPostTask.post[@"user_id"] intValue] != testPostTask.userId) {
199-
XCTFail(@"testPostNetTask failed");
213+
XCTFail(@"%@ failed", _expectation.description);
200214
}
201215
}
202216
else if ([task isKindOfClass:[STTestPutNetTask class]]) {
203217
[_expectation fulfill];
204218
STTestPutNetTask *testPutTask = (STTestPutNetTask *)task;
205219
if (task.error || !testPutTask.post) {
206-
XCTFail(@"testPutNetTask failed");
220+
XCTFail(@"%@ failed", _expectation.description);
207221
}
208222
}
209223
else if ([task isKindOfClass:[STTestPatchNetTask class]]) {
210224
[_expectation fulfill];
211225
STTestPatchNetTask *testPatchTask = (STTestPatchNetTask *)task;
212226
if (task.error || !testPatchTask.post) {
213-
XCTFail(@"testPatchNetTask failed");
227+
XCTFail(@"%@ failed", _expectation.description);
214228
}
215229
}
216230
else if ([task isKindOfClass:[STTestDeleteNetTask class]]) {
217231
[_expectation fulfill];
218232
if (task.error) {
219-
XCTFail(@"testDeleteNetTask failed");
233+
XCTFail(@"%@ failed", _expectation.description);
220234
}
221235
}
222236
else if ([task isKindOfClass:[STTestMaxConcurrentTasksCountNetTask class]]) {

0 commit comments

Comments
 (0)