LeslieAsyncImageDownloader.m 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. //
  2. // LeslieAsyncImageDownloader.m
  3. // AsyncUIImageView
  4. //
  5. // Created by Leslie.Fang on 14-8-11.
  6. // Copyright (c) 2014年 Enway. All rights reserved.
  7. //
  8. #import "LeslieAsyncImageDownloader.h"
  9. @implementation LeslieAsyncImageDownloader
  10. +(id)sharedImageLoader{
  11. static LeslieAsyncImageDownloader *sharedImageLoader = nil;
  12. static dispatch_once_t onceToken;
  13. dispatch_once(&onceToken, ^{
  14. sharedImageLoader = [[self alloc] init];
  15. });
  16. return sharedImageLoader;
  17. }
  18. - (void)downloadImageWithURL:(NSURL *)url complete:(ImageDownloadedBlock)completeBlock{
  19. LeslieImageCache *imageCache = [LeslieImageCache sharedCache];
  20. NSString *imageUrl = [url absoluteString];
  21. UIImage *image = [imageCache getImageFromMemoryForkey:imageUrl];
  22. // // 先从内存中取
  23. if (image) {
  24. if (completeBlock) {
  25. //NSLog(@"image exists in memory");
  26. completeBlock(image,nil,url);
  27. }
  28. return;
  29. }
  30. // 再从文件中取
  31. image = [imageCache getImageFromFileForKey:imageUrl];
  32. if (image) {
  33. if (completeBlock) {
  34. //NSLog(@"image exists in file");
  35. completeBlock(image,nil,url);
  36. }
  37. // 重新加入到 NSCache 中
  38. [imageCache cacheImageToMemory:image forKey:imageUrl];
  39. return;
  40. }
  41. // 内存和文件中都没有再从网络下载
  42. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^(void){
  43. NSError * error;
  44. NSData *imgData = [NSData dataWithContentsOfURL:url options:NSDataReadingMappedIfSafe error:&error];
  45. dispatch_async(dispatch_get_main_queue(), ^{
  46. UIImage *image = [UIImage imageWithData:imgData];
  47. if (image) {
  48. // 先缓存图片到内存
  49. [imageCache cacheImageToMemory:image forKey:imageUrl];
  50. // 再缓存图片到文件系统
  51. NSString *extension = [[imageUrl substringFromIndex:imageUrl.length-3] lowercaseString];
  52. NSString *imageType = @"jpg";
  53. if ([extension isEqualToString:@"jpg"]) {
  54. imageType = @"jpg";
  55. }else{
  56. imageType = @"png";
  57. }
  58. [imageCache cacheImageToFile:image forKey:imageUrl ofType:imageType];
  59. }
  60. if (completeBlock) {
  61. completeBlock(image,error,url);
  62. }
  63. });
  64. });
  65. }
  66. - (void)downloadImageWithMultipleURL:(NSURL *)url complete:(ImageDownloadedBlock)completeBlock{
  67. LeslieImageCache *imageCache = [LeslieImageCache sharedCacheMultiple];
  68. NSString *imageUrl = [url absoluteString];
  69. // UIImage *image = [imageCache getImageFromMemoryForkey:imageUrl];
  70. // // // 先从内存中取
  71. // if (image) {
  72. // if (completeBlock) {
  73. // //NSLog(@"image exists in memory");
  74. // completeBlock(image,nil,url);
  75. // }
  76. //
  77. // return;
  78. // }
  79. // 再从文件中取
  80. // image = [imageCache getImageFromFileForKey:imageUrl];
  81. // if (image) {
  82. // if (completeBlock) {
  83. // //NSLog(@"image exists in file");
  84. // completeBlock(image,nil,url);
  85. // }
  86. //
  87. // // 重新加入到 NSCache 中
  88. // [imageCache cacheImageToMemory:image forKey:imageUrl];
  89. //
  90. // return;
  91. // }
  92. // 内存和文件中都没有再从网络下载
  93. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^(void){
  94. NSError * error;
  95. NSData *imgData = [NSData dataWithContentsOfURL:url options:NSDataReadingMappedIfSafe error:&error];
  96. dispatch_async(dispatch_get_main_queue(), ^{
  97. UIImage *image = [UIImage imageWithData:imgData];
  98. if (image) {
  99. // 先缓存图片到内存
  100. // [imageCache cacheImageToMemory:image forKey:imageUrl];
  101. // 再缓存图片到文件系统
  102. NSString *extension = [[imageUrl substringFromIndex:imageUrl.length-3] lowercaseString];
  103. NSString *imageType = @"jpg";
  104. if ([extension isEqualToString:@"jpg"]) {
  105. imageType = @"jpg";
  106. }else{
  107. imageType = @"png";
  108. }
  109. [imageCache cacheImageToFile:image forKey:imageUrl ofType:imageType];
  110. }
  111. if (completeBlock) {
  112. completeBlock(image,error,url);
  113. }
  114. });
  115. });
  116. }
  117. +(NSData *)resetSizeOfImageData:(UIImage *)source_image maxSize:(NSInteger)maxSize
  118. {
  119. //先调整分辨率
  120. CGSize newSize = CGSizeMake(source_image.size.width, source_image.size.height);
  121. CGFloat tempHeight = newSize.height / 1024;
  122. CGFloat tempWidth = newSize.width / 1024;
  123. if (tempWidth > 1.0 && tempWidth > tempHeight) {
  124. newSize = CGSizeMake(source_image.size.width / tempWidth, source_image.size.height / tempWidth);
  125. }
  126. else if (tempHeight > 1.0 && tempWidth < tempHeight){
  127. newSize = CGSizeMake(source_image.size.width / tempHeight, source_image.size.height / tempHeight);
  128. }
  129. UIGraphicsBeginImageContext(newSize);
  130. [source_image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
  131. UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
  132. UIGraphicsEndImageContext();
  133. //调整大小
  134. NSData *imageData = UIImageJPEGRepresentation(newImage,1.0);
  135. NSUInteger sizeOrigin = [imageData length];
  136. NSUInteger sizeOriginKB = sizeOrigin / 1024;
  137. if (sizeOriginKB > maxSize) {
  138. NSData *finallImageData = UIImageJPEGRepresentation(newImage,0.5);
  139. return finallImageData;
  140. }
  141. return imageData;
  142. }
  143. @end