Skip to content

Commit 50d3850

Browse files
committed
Use NSHashTable with weak reference instead of NSArray.
1 parent 5343fb3 commit 50d3850

File tree

1 file changed

+15
-49
lines changed

1 file changed

+15
-49
lines changed

STNetTaskQueue/STNetTaskQueue.m

Lines changed: 15 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,11 @@
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

Comments
 (0)