Files
PINRemoteImage/Pod/Classes/PINRemoteImageTask.m
2016-03-28 17:08:53 -07:00

101 lines
3.6 KiB
Objective-C

//
// PINRemoteImageTask.m
// Pods
//
// Created by Garrett Moon on 3/9/15.
//
//
#import "PINRemoteImageTask.h"
#import "PINRemoteImageCallbacks.h"
@implementation PINRemoteImageTask
- (instancetype)init
{
if (self = [super init]) {
self.callbackBlocks = [[NSMutableDictionary alloc] init];
}
return self;
}
- (NSString *)description
{
return [NSString stringWithFormat:@"<%@: %p> completionBlocks: %lu", NSStringFromClass([self class]), self, (unsigned long)self.callbackBlocks.count];
}
- (void)addCallbacksWithCompletionBlock:(PINRemoteImageManagerImageCompletion)completionBlock
progressImageBlock:(PINRemoteImageManagerImageCompletion)progressImageBlock
progressDownloadBlock:(PINRemoteImageManagerProgressDownload)progressDownloadBlock
withUUID:(NSUUID *)UUID
{
PINRemoteImageCallbacks *completion = [[PINRemoteImageCallbacks alloc] init];
completion.completionBlock = completionBlock;
completion.progressImageBlock = progressImageBlock;
completion.progressDownloadBlock = progressDownloadBlock;
[self.callbackBlocks setObject:completion forKey:UUID];
}
- (void)removeCallbackWithUUID:(NSUUID *)UUID
{
[self.callbackBlocks removeObjectForKey:UUID];
}
- (void)callCompletionsWithQueue:(dispatch_queue_t)queue
remove:(BOOL)remove
withImage:(PINImage *)image
alternativeRepresentation:(id)alternativeRepresentation
cached:(BOOL)cached
error:(NSError *)error
{
__weak typeof(self) weakSelf = self;
[self.callbackBlocks enumerateKeysAndObjectsUsingBlock:^(NSUUID *UUID, PINRemoteImageCallbacks *callback, BOOL *stop) {
typeof(self) strongSelf = weakSelf;
if (callback.completionBlock != nil) {
PINLog(@"calling completion for UUID: %@ key: %@", UUID, strongSelf.key);
PINRemoteImageManagerImageCompletion completionBlock = callback.completionBlock;
CFTimeInterval requestTime = callback.requestTime;
//The code run asynchronously below is *not* guaranteed to be run in the manager's lock!
//All access to the callbacks and self should be done outside the block below!
dispatch_async(queue, ^
{
PINRemoteImageResultType result;
if (image || alternativeRepresentation) {
result = cached ? PINRemoteImageResultTypeCache : PINRemoteImageResultTypeDownload;
} else {
result = PINRemoteImageResultTypeNone;
}
completionBlock([PINRemoteImageManagerResult imageResultWithImage:image
alternativeRepresentation:alternativeRepresentation
requestLength:CACurrentMediaTime() - requestTime
error:error
resultType:result
UUID:UUID]);
});
}
if (remove) {
[strongSelf removeCallbackWithUUID:UUID];
}
}];
}
- (BOOL)cancelWithUUID:(NSUUID *)UUID manager:(PINRemoteImageManager *)manager
{
BOOL noMoreCompletions = NO;
[self removeCallbackWithUUID:UUID];
if ([self.callbackBlocks count] == 0) {
noMoreCompletions = YES;
}
return noMoreCompletions;
}
- (void)setPriority:(PINRemoteImageManagerPriority)priority
{
}
@end