99#import " STNetTaskQueue.h"
1010#import " STNetTaskQueueLog.h"
1111
12- @interface STNetTaskDelegateWeakReference : NSObject
13-
14- @property (nonatomic , weak ) id <STNetTaskDelegate> delegate;
15-
16- @end
17-
18- @implementation STNetTaskDelegateWeakReference
19-
20- @end
21-
2212@interface STNetTaskQueue ()
2313
2414@property (nonatomic , strong ) NSThread *thred;
2515@property (nonatomic , strong ) NSRecursiveLock *lock;
26- @property (nonatomic , strong ) NSMutableDictionary *taskDelegates; // <NSString, NSArray<STNetTaskDelegateWeakReference >>
16+ @property (nonatomic , strong ) NSMutableDictionary *taskDelegates; // <NSString, NSHashTable<STNetTaskDelegate >>
2717@property (nonatomic , strong ) NSMutableArray *tasks; // <STNetTask>
2818@property (nonatomic , strong ) NSMutableArray *watingTasks; // <STNetTask>
2919
@@ -202,32 +192,30 @@ - (void)_netTaskDidEnd:(STNetTask *)task
202192{
203193 [self .lock lock ];
204194
205- NSArray *delegates = self.taskDelegates [task.uri];
206- for (STNetTaskDelegateWeakReference *weakReference in delegates) {
195+ NSHashTable *delegates = self.taskDelegates [task.uri];
196+ NSArray *allDelegates = [NSArray arrayWithArray: delegates.allObjects];
197+
198+ [self .lock unlock ];
199+
200+ if (allDelegates.count ) {
207201 dispatch_async (dispatch_get_main_queue (), ^ {
208- [weakReference.delegate netTaskDidEnd: task];
202+ for (id <STNetTaskDelegate> delegate in allDelegates) {
203+ [delegate netTaskDidEnd: task];
204+ }
209205 });
210206 }
211-
212- [self .lock unlock ];
213207}
214208
215209- (void )addTaskDelegate : (id <STNetTaskDelegate>)delegate uri : (NSString *)uri
216210{
217211 [self .lock lock ];
218212
219- NSMutableArray *delegates = self.taskDelegates [uri];
213+ NSHashTable *delegates = self.taskDelegates [uri];
220214 if (!delegates) {
221- delegates = [NSMutableArray new ];
215+ delegates = [NSHashTable weakObjectsHashTable ];
222216 self.taskDelegates [uri] = delegates;
223217 }
224-
225- NSInteger indexOfDelegate = [self indexOfTaskDelegate: delegate inDelegates: delegates];
226- if (indexOfDelegate == NSNotFound ) {
227- STNetTaskDelegateWeakReference *weakReference = [STNetTaskDelegateWeakReference new ];
228- weakReference.delegate = delegate;
229- [delegates addObject: weakReference];
230- }
218+ [delegates addObject: delegate];
231219
232220 [self .lock unlock ];
233221}
@@ -247,32 +235,10 @@ - (void)removeTaskDelegate:(id<STNetTaskDelegate>)delegate uri:(NSString *)uri
247235{
248236 [self .lock lock ];
249237
250- NSMutableArray *delegates = self.taskDelegates [uri];
251- NSInteger indexOfDelegate = [self indexOfTaskDelegate: delegate inDelegates: delegates];
252- if (indexOfDelegate != NSNotFound ) {
253- [delegates removeObjectAtIndex: indexOfDelegate];
254- }
238+ NSHashTable *delegates = self.taskDelegates [uri];
239+ [delegates removeObject: delegate];
255240
256241 [self .lock unlock ];
257242}
258243
259- - (NSInteger )indexOfTaskDelegate : (id <STNetTaskDelegate>)delegate inDelegates : (NSMutableArray *)delegates
260- {
261- NSInteger index = NSNotFound ;
262- NSMutableArray *toBeDeleted = [NSMutableArray new ];
263- NSInteger i = 0 ;
264- for (STNetTaskDelegateWeakReference *weakReference in delegates) {
265- if (weakReference.delegate == delegate) {
266- index = i;
267- }
268- if (!weakReference.delegate ) {
269- [toBeDeleted addObject: weakReference];
270- }
271- i++;
272- }
273-
274- [delegates removeObjectsInArray: toBeDeleted];
275- return index;
276- }
277-
278244@end
0 commit comments