mirror of
https://github.com/gnustep/libs-base.git
synced 2025-05-01 20:40:53 +00:00
98 lines
2 KiB
Objective-C
98 lines
2 KiB
Objective-C
#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
|