PINRemoteImageCategoryManager.m 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. //
  2. // PINRemoteImageCategory.m
  3. // Pods
  4. //
  5. // Created by Garrett Moon on 11/4/14.
  6. //
  7. //
  8. #import "PINRemoteImageCategoryManager.h"
  9. #import <objc/runtime.h>
  10. @implementation PINRemoteImageCategoryManager
  11. + (void)setImageOnView:(id <PINRemoteImageCategory>)view
  12. fromURL:(NSURL *)url
  13. {
  14. [self setImageOnView:view fromURL:url placeholderImage:nil];
  15. }
  16. + (void)setImageOnView:(id <PINRemoteImageCategory>)view
  17. fromURL:(NSURL *)url
  18. placeholderImage:(PINImage *)placeholderImage
  19. {
  20. [self setImageOnView:view fromURL:url placeholderImage:placeholderImage completion:nil];
  21. }
  22. + (void)setImageOnView:(id <PINRemoteImageCategory>)view
  23. fromURL:(NSURL *)url
  24. completion:(PINRemoteImageManagerImageCompletion)completion
  25. {
  26. [self setImageOnView:view fromURL:url placeholderImage:nil completion:completion];
  27. }
  28. + (void)setImageOnView:(id <PINRemoteImageCategory>)view
  29. fromURL:(NSURL *)url
  30. placeholderImage:(PINImage *)placeholderImage
  31. completion:(PINRemoteImageManagerImageCompletion)completion
  32. {
  33. [self setImageOnView:view
  34. fromURLs:url?@[url]:nil
  35. placeholderImage:placeholderImage
  36. processorKey:nil
  37. processor:nil
  38. completion:completion];
  39. }
  40. + (void)setImageOnView:(id <PINRemoteImageCategory>)view
  41. fromURL:(NSURL *)url
  42. processorKey:(NSString *)processorKey
  43. processor:(PINRemoteImageManagerImageProcessor)processor
  44. {
  45. [self setImageOnView:view
  46. fromURL:url
  47. processorKey:processorKey
  48. processor:processor
  49. completion:nil];
  50. }
  51. + (void)setImageOnView:(id <PINRemoteImageCategory>)view
  52. fromURL:(NSURL *)url
  53. placeholderImage:(PINImage *)placeholderImage
  54. processorKey:(NSString *)processorKey
  55. processor:(PINRemoteImageManagerImageProcessor)processor
  56. {
  57. [self setImageOnView:view
  58. fromURLs:url?@[url]:nil
  59. placeholderImage:placeholderImage
  60. processorKey:processorKey
  61. processor:processor
  62. completion:nil];
  63. }
  64. + (void)setImageOnView:(id <PINRemoteImageCategory>)view
  65. fromURL:(NSURL *)url
  66. processorKey:(NSString *)processorKey
  67. processor:(PINRemoteImageManagerImageProcessor)processor
  68. completion:(PINRemoteImageManagerImageCompletion)completion
  69. {
  70. [self setImageOnView:view
  71. fromURLs:url?@[url]:nil
  72. placeholderImage:nil
  73. processorKey:processorKey
  74. processor:processor
  75. completion:completion];
  76. }
  77. + (void)setImageOnView:(id <PINRemoteImageCategory>)view
  78. fromURLs:(NSArray <NSURL *> *)urls
  79. {
  80. [self setImageOnView:view
  81. fromURLs:urls
  82. placeholderImage:nil];
  83. }
  84. + (void)setImageOnView:(id <PINRemoteImageCategory>)view
  85. fromURLs:(NSArray <NSURL *> *)urls
  86. placeholderImage:(PINImage *)placeholderImage
  87. {
  88. [self setImageOnView:view
  89. fromURLs:urls
  90. placeholderImage:placeholderImage
  91. completion:nil];
  92. }
  93. + (void)setImageOnView:(id <PINRemoteImageCategory>)view
  94. fromURLs:(NSArray <NSURL *> *)urls
  95. placeholderImage:(PINImage *)placeholderImage
  96. completion:(PINRemoteImageManagerImageCompletion)completion
  97. {
  98. return [self setImageOnView:view
  99. fromURLs:urls
  100. placeholderImage:placeholderImage
  101. processorKey:nil
  102. processor:nil
  103. completion:completion];
  104. }
  105. + (NSUUID *)downloadImageOperationUUIDOnView:(id <PINRemoteImageCategory>)view
  106. {
  107. return (NSUUID *)objc_getAssociatedObject(view, @selector(downloadImageOperationUUIDOnView:));
  108. }
  109. + (void)setDownloadImageOperationUUID:(NSUUID *)downloadImageOperationUUID onView:(id <PINRemoteImageCategory>)view
  110. {
  111. objc_setAssociatedObject(view, @selector(downloadImageOperationUUIDOnView:), downloadImageOperationUUID, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  112. }
  113. + (BOOL)updateWithProgressOnView:(id <PINRemoteImageCategory>)view
  114. {
  115. return [(NSNumber *)objc_getAssociatedObject(view, @selector(updateWithProgressOnView:)) boolValue];
  116. }
  117. + (void)setUpdateWithProgressOnView:(BOOL)updateWithProgress onView:(id <PINRemoteImageCategory>)view
  118. {
  119. objc_setAssociatedObject(view, @selector(updateWithProgressOnView:), [NSNumber numberWithBool:updateWithProgress], OBJC_ASSOCIATION_RETAIN);
  120. }
  121. + (void)cancelImageDownloadOnView:(id <PINRemoteImageCategory>)view
  122. {
  123. if ([self downloadImageOperationUUIDOnView:view]) {
  124. [[PINRemoteImageManager sharedImageManager] cancelTaskWithUUID:[self downloadImageOperationUUIDOnView:view]];
  125. [self setDownloadImageOperationUUID:nil onView:view];
  126. }
  127. }
  128. + (void)setImageOnView:(id <PINRemoteImageCategory>)view
  129. fromURLs:(NSArray <NSURL *> *)urls
  130. placeholderImage:(PINImage *)placeholderImage
  131. processorKey:(NSString *)processorKey
  132. processor:(PINRemoteImageManagerImageProcessor)processor
  133. completion:(PINRemoteImageManagerImageCompletion)completion
  134. {
  135. if (![NSThread isMainThread]) {
  136. dispatch_async(dispatch_get_main_queue(), ^{
  137. [self setImageOnView:view
  138. fromURLs:urls
  139. placeholderImage:placeholderImage
  140. processorKey:processorKey
  141. processor:processor
  142. completion:completion];
  143. });
  144. return;
  145. }
  146. [self cancelImageDownloadOnView:view];
  147. if (placeholderImage) {
  148. [view pin_setPlaceholderWithImage:placeholderImage];
  149. }
  150. if (urls == nil || urls.count == 0) {
  151. if (!placeholderImage) {
  152. [view pin_clearImages];
  153. }
  154. return;
  155. }
  156. PINRemoteImageManagerDownloadOptions options;
  157. if([view respondsToSelector:@selector(pin_defaultOptions)]) {
  158. options = [view pin_defaultOptions];
  159. } else {
  160. options = PINRemoteImageManagerDownloadOptionsNone;
  161. }
  162. if ([view pin_ignoreGIFs]) {
  163. options |= PINRemoteImageManagerDisallowAlternateRepresentations;
  164. }
  165. PINRemoteImageManagerImageCompletion internalProgress = nil;
  166. if ([self updateWithProgressOnView:view] && processorKey.length <= 0 && processor == nil) {
  167. internalProgress = ^(PINRemoteImageManagerResult *result)
  168. {
  169. void (^mainQueue)() = ^{
  170. //if result.UUID is nil, we returned immediately and want this result
  171. NSUUID *currentUUID = [self downloadImageOperationUUIDOnView:view];
  172. if (![currentUUID isEqual:result.UUID] && result.UUID != nil) {
  173. return;
  174. }
  175. if (result.image) {
  176. [view pin_updateUIWithRemoteImageManagerResult:result];
  177. }
  178. };
  179. if ([NSThread isMainThread]) {
  180. mainQueue();
  181. } else {
  182. dispatch_async(dispatch_get_main_queue(), ^{
  183. mainQueue();
  184. });
  185. }
  186. };
  187. }
  188. PINRemoteImageManagerImageCompletion internalCompletion = ^(PINRemoteImageManagerResult *result)
  189. {
  190. void (^mainQueue)() = ^{
  191. //if result.UUID is nil, we returned immediately and want this result
  192. NSUUID *currentUUID = [self downloadImageOperationUUIDOnView:view];
  193. if (![currentUUID isEqual:result.UUID] && result.UUID != nil) {
  194. return;
  195. }
  196. [self setDownloadImageOperationUUID:nil onView:view];
  197. if (result.error) {
  198. if (completion) {
  199. completion(result);
  200. }
  201. return;
  202. }
  203. [view pin_updateUIWithRemoteImageManagerResult:result];
  204. if (completion) {
  205. completion(result);
  206. }
  207. };
  208. if ([NSThread isMainThread]) {
  209. mainQueue();
  210. } else {
  211. dispatch_async(dispatch_get_main_queue(), ^{
  212. mainQueue();
  213. });
  214. }
  215. };
  216. NSUUID *downloadImageOperationUUID = nil;
  217. if (urls.count > 1) {
  218. downloadImageOperationUUID = [[PINRemoteImageManager sharedImageManager] downloadImageWithURLs:urls
  219. options:options
  220. progressImage:internalProgress
  221. completion:internalCompletion];
  222. } else if (processorKey.length > 0 && processor) {
  223. downloadImageOperationUUID = [[PINRemoteImageManager sharedImageManager] downloadImageWithURL:urls[0]
  224. options:options
  225. processorKey:processorKey
  226. processor:processor
  227. completion:internalCompletion];
  228. } else {
  229. downloadImageOperationUUID = [[PINRemoteImageManager sharedImageManager] downloadImageWithURL:urls[0]
  230. options:options
  231. progressImage:internalProgress
  232. completion:internalCompletion];
  233. }
  234. [self setDownloadImageOperationUUID:downloadImageOperationUUID onView:view];
  235. }
  236. @end