mirror of
https://github.com/zhigang1992/PINRemoteImage.git
synced 2026-03-28 22:45:33 +08:00
101 lines
3.6 KiB
Objective-C
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
|