1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
|
#import "GSTaskRegistry.h"
#import "Foundation/NSDictionary.h"
#import "Foundation/NSException.h"
#import "Foundation/NSURLSession.h"
@implementation GSTaskRegistry
{
NSMutableDictionary *_tasks;
void (^_tasksCompletion)(void);
}
- (instancetype) init
{
if (nil != (self = [super init]))
{
_tasks = [[NSMutableDictionary alloc] init];
}
return self;
}
- (void) dealloc
{
DESTROY(_tasks);
[super dealloc];
}
- (NSArray*) allTasks
{
return [_tasks allValues];
}
- (BOOL) isEmpty
{
return [_tasks count] == 0;
}
- (void) notifyOnTasksCompletion: (void (^)(void))tasksCompletion
{
_tasksCompletion = tasksCompletion;
}
- (void) addTask: (NSURLSessionTask*)task
{
NSString *identifier;
NSUInteger taskIdentifier;
NSURLSessionTask *t;
taskIdentifier = [task taskIdentifier];
NSAssert(taskIdentifier != 0, @"Invalid task identifier");
identifier = [NSString stringWithFormat: @"%lu", taskIdentifier];
if (nil != (t = [_tasks objectForKey: identifier]))
{
if ([t isEqual: task])
{
NSAssert(NO,
@"Trying to re-insert a task that's already in the registry.");
}
else
{
NSAssert(NO,
@"Trying to insert a task, but a different task with the same"
@" identifier is already in the registry.");
}
}
[_tasks setObject: task forKey: identifier];
}
- (void) removeTask: (NSURLSessionTask*)task
{
NSString *identifier;
NSUInteger taskIdentifier;
taskIdentifier = [task taskIdentifier];
NSAssert(taskIdentifier != 0, @"Invalid task identifier");
identifier = [NSString stringWithFormat: @"%lu", taskIdentifier];
if (nil == [_tasks objectForKey: identifier])
{
NSAssert(NO, @"Trying to remove task, but it's not in the registry.");
}
[_tasks removeObjectForKey: identifier];
if (nil != _tasksCompletion && [self isEmpty])
{
_tasksCompletion();
}
}
@end
|