| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269 |
- //
- // PINRemoteImageCategory.m
- // Pods
- //
- // Created by Garrett Moon on 11/4/14.
- //
- //
- #import "PINRemoteImageCategoryManager.h"
- #import <objc/runtime.h>
- @implementation PINRemoteImageCategoryManager
- + (void)setImageOnView:(id <PINRemoteImageCategory>)view
- fromURL:(NSURL *)url
- {
- [self setImageOnView:view fromURL:url placeholderImage:nil];
- }
- + (void)setImageOnView:(id <PINRemoteImageCategory>)view
- fromURL:(NSURL *)url
- placeholderImage:(PINImage *)placeholderImage
- {
- [self setImageOnView:view fromURL:url placeholderImage:placeholderImage completion:nil];
- }
- + (void)setImageOnView:(id <PINRemoteImageCategory>)view
- fromURL:(NSURL *)url
- completion:(PINRemoteImageManagerImageCompletion)completion
- {
- [self setImageOnView:view fromURL:url placeholderImage:nil completion:completion];
- }
- + (void)setImageOnView:(id <PINRemoteImageCategory>)view
- fromURL:(NSURL *)url
- placeholderImage:(PINImage *)placeholderImage
- completion:(PINRemoteImageManagerImageCompletion)completion
- {
- [self setImageOnView:view
- fromURLs:url?@[url]:nil
- placeholderImage:placeholderImage
- processorKey:nil
- processor:nil
- completion:completion];
- }
- + (void)setImageOnView:(id <PINRemoteImageCategory>)view
- fromURL:(NSURL *)url
- processorKey:(NSString *)processorKey
- processor:(PINRemoteImageManagerImageProcessor)processor
- {
- [self setImageOnView:view
- fromURL:url
- processorKey:processorKey
- processor:processor
- completion:nil];
- }
- + (void)setImageOnView:(id <PINRemoteImageCategory>)view
- fromURL:(NSURL *)url
- placeholderImage:(PINImage *)placeholderImage
- processorKey:(NSString *)processorKey
- processor:(PINRemoteImageManagerImageProcessor)processor
- {
- [self setImageOnView:view
- fromURLs:url?@[url]:nil
- placeholderImage:placeholderImage
- processorKey:processorKey
- processor:processor
- completion:nil];
- }
- + (void)setImageOnView:(id <PINRemoteImageCategory>)view
- fromURL:(NSURL *)url
- processorKey:(NSString *)processorKey
- processor:(PINRemoteImageManagerImageProcessor)processor
- completion:(PINRemoteImageManagerImageCompletion)completion
- {
- [self setImageOnView:view
- fromURLs:url?@[url]:nil
- placeholderImage:nil
- processorKey:processorKey
- processor:processor
- completion:completion];
- }
- + (void)setImageOnView:(id <PINRemoteImageCategory>)view
- fromURLs:(NSArray <NSURL *> *)urls
- {
- [self setImageOnView:view
- fromURLs:urls
- placeholderImage:nil];
- }
- + (void)setImageOnView:(id <PINRemoteImageCategory>)view
- fromURLs:(NSArray <NSURL *> *)urls
- placeholderImage:(PINImage *)placeholderImage
- {
- [self setImageOnView:view
- fromURLs:urls
- placeholderImage:placeholderImage
- completion:nil];
- }
- + (void)setImageOnView:(id <PINRemoteImageCategory>)view
- fromURLs:(NSArray <NSURL *> *)urls
- placeholderImage:(PINImage *)placeholderImage
- completion:(PINRemoteImageManagerImageCompletion)completion
- {
- return [self setImageOnView:view
- fromURLs:urls
- placeholderImage:placeholderImage
- processorKey:nil
- processor:nil
- completion:completion];
- }
- + (NSUUID *)downloadImageOperationUUIDOnView:(id <PINRemoteImageCategory>)view
- {
- return (NSUUID *)objc_getAssociatedObject(view, @selector(downloadImageOperationUUIDOnView:));
- }
- + (void)setDownloadImageOperationUUID:(NSUUID *)downloadImageOperationUUID onView:(id <PINRemoteImageCategory>)view
- {
- objc_setAssociatedObject(view, @selector(downloadImageOperationUUIDOnView:), downloadImageOperationUUID, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
- }
- + (BOOL)updateWithProgressOnView:(id <PINRemoteImageCategory>)view
- {
- return [(NSNumber *)objc_getAssociatedObject(view, @selector(updateWithProgressOnView:)) boolValue];
- }
- + (void)setUpdateWithProgressOnView:(BOOL)updateWithProgress onView:(id <PINRemoteImageCategory>)view
- {
- objc_setAssociatedObject(view, @selector(updateWithProgressOnView:), [NSNumber numberWithBool:updateWithProgress], OBJC_ASSOCIATION_RETAIN);
- }
- + (void)cancelImageDownloadOnView:(id <PINRemoteImageCategory>)view
- {
- if ([self downloadImageOperationUUIDOnView:view]) {
- [[PINRemoteImageManager sharedImageManager] cancelTaskWithUUID:[self downloadImageOperationUUIDOnView:view]];
- [self setDownloadImageOperationUUID:nil onView:view];
- }
- }
- + (void)setImageOnView:(id <PINRemoteImageCategory>)view
- fromURLs:(NSArray <NSURL *> *)urls
- placeholderImage:(PINImage *)placeholderImage
- processorKey:(NSString *)processorKey
- processor:(PINRemoteImageManagerImageProcessor)processor
- completion:(PINRemoteImageManagerImageCompletion)completion
- {
- if (![NSThread isMainThread]) {
- dispatch_async(dispatch_get_main_queue(), ^{
- [self setImageOnView:view
- fromURLs:urls
- placeholderImage:placeholderImage
- processorKey:processorKey
- processor:processor
- completion:completion];
- });
- return;
- }
-
- [self cancelImageDownloadOnView:view];
-
- if (placeholderImage) {
- [view pin_setPlaceholderWithImage:placeholderImage];
- }
-
- if (urls == nil || urls.count == 0) {
- if (!placeholderImage) {
- [view pin_clearImages];
- }
- return;
- }
-
- PINRemoteImageManagerDownloadOptions options;
- if([view respondsToSelector:@selector(pin_defaultOptions)]) {
- options = [view pin_defaultOptions];
- } else {
- options = PINRemoteImageManagerDownloadOptionsNone;
- }
-
- if ([view pin_ignoreGIFs]) {
- options |= PINRemoteImageManagerDisallowAlternateRepresentations;
- }
-
- PINRemoteImageManagerImageCompletion internalProgress = nil;
- if ([self updateWithProgressOnView:view] && processorKey.length <= 0 && processor == nil) {
- internalProgress = ^(PINRemoteImageManagerResult *result)
- {
- void (^mainQueue)() = ^{
- //if result.UUID is nil, we returned immediately and want this result
- NSUUID *currentUUID = [self downloadImageOperationUUIDOnView:view];
- if (![currentUUID isEqual:result.UUID] && result.UUID != nil) {
- return;
- }
- if (result.image) {
- [view pin_updateUIWithRemoteImageManagerResult:result];
- }
- };
- if ([NSThread isMainThread]) {
- mainQueue();
- } else {
- dispatch_async(dispatch_get_main_queue(), ^{
- mainQueue();
- });
- }
- };
- }
-
- PINRemoteImageManagerImageCompletion internalCompletion = ^(PINRemoteImageManagerResult *result)
- {
- void (^mainQueue)() = ^{
- //if result.UUID is nil, we returned immediately and want this result
- NSUUID *currentUUID = [self downloadImageOperationUUIDOnView:view];
- if (![currentUUID isEqual:result.UUID] && result.UUID != nil) {
- return;
- }
- [self setDownloadImageOperationUUID:nil onView:view];
- if (result.error) {
- if (completion) {
- completion(result);
- }
- return;
- }
-
- [view pin_updateUIWithRemoteImageManagerResult:result];
-
- if (completion) {
- completion(result);
- }
- };
- if ([NSThread isMainThread]) {
- mainQueue();
- } else {
- dispatch_async(dispatch_get_main_queue(), ^{
- mainQueue();
- });
- }
- };
-
- NSUUID *downloadImageOperationUUID = nil;
- if (urls.count > 1) {
- downloadImageOperationUUID = [[PINRemoteImageManager sharedImageManager] downloadImageWithURLs:urls
- options:options
- progressImage:internalProgress
- completion:internalCompletion];
- } else if (processorKey.length > 0 && processor) {
- downloadImageOperationUUID = [[PINRemoteImageManager sharedImageManager] downloadImageWithURL:urls[0]
- options:options
- processorKey:processorKey
- processor:processor
- completion:internalCompletion];
- } else {
- downloadImageOperationUUID = [[PINRemoteImageManager sharedImageManager] downloadImageWithURL:urls[0]
- options:options
- progressImage:internalProgress
- completion:internalCompletion];
- }
-
- [self setDownloadImageOperationUUID:downloadImageOperationUUID onView:view];
- }
- @end
|