// // LeslieAsyncImageDownloader.m // AsyncUIImageView // // Created by Leslie.Fang on 14-8-11. // Copyright (c) 2014年 Enway. All rights reserved. // #import "LeslieAsyncImageDownloader.h" @implementation LeslieAsyncImageDownloader +(id)sharedImageLoader{ static LeslieAsyncImageDownloader *sharedImageLoader = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ sharedImageLoader = [[self alloc] init]; }); return sharedImageLoader; } - (void)downloadImageWithURL:(NSURL *)url complete:(ImageDownloadedBlock)completeBlock{ LeslieImageCache *imageCache = [LeslieImageCache sharedCache]; NSString *imageUrl = [url absoluteString]; UIImage *image = [imageCache getImageFromMemoryForkey:imageUrl]; // // 先从内存中取 if (image) { if (completeBlock) { //NSLog(@"image exists in memory"); completeBlock(image,nil,url); } return; } // 再从文件中取 image = [imageCache getImageFromFileForKey:imageUrl]; if (image) { if (completeBlock) { //NSLog(@"image exists in file"); completeBlock(image,nil,url); } // 重新加入到 NSCache 中 [imageCache cacheImageToMemory:image forKey:imageUrl]; return; } // 内存和文件中都没有再从网络下载 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^(void){ NSError * error; NSData *imgData = [NSData dataWithContentsOfURL:url options:NSDataReadingMappedIfSafe error:&error]; dispatch_async(dispatch_get_main_queue(), ^{ UIImage *image = [UIImage imageWithData:imgData]; if (image) { // 先缓存图片到内存 [imageCache cacheImageToMemory:image forKey:imageUrl]; // 再缓存图片到文件系统 NSString *extension = [[imageUrl substringFromIndex:imageUrl.length-3] lowercaseString]; NSString *imageType = @"jpg"; if ([extension isEqualToString:@"jpg"]) { imageType = @"jpg"; }else{ imageType = @"png"; } [imageCache cacheImageToFile:image forKey:imageUrl ofType:imageType]; } if (completeBlock) { completeBlock(image,error,url); } }); }); } - (void)downloadImageWithMultipleURL:(NSURL *)url complete:(ImageDownloadedBlock)completeBlock{ LeslieImageCache *imageCache = [LeslieImageCache sharedCacheMultiple]; NSString *imageUrl = [url absoluteString]; // UIImage *image = [imageCache getImageFromMemoryForkey:imageUrl]; // // // 先从内存中取 // if (image) { // if (completeBlock) { // //NSLog(@"image exists in memory"); // completeBlock(image,nil,url); // } // // return; // } // 再从文件中取 // image = [imageCache getImageFromFileForKey:imageUrl]; // if (image) { // if (completeBlock) { // //NSLog(@"image exists in file"); // completeBlock(image,nil,url); // } // // // 重新加入到 NSCache 中 // [imageCache cacheImageToMemory:image forKey:imageUrl]; // // return; // } // 内存和文件中都没有再从网络下载 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^(void){ NSError * error; NSData *imgData = [NSData dataWithContentsOfURL:url options:NSDataReadingMappedIfSafe error:&error]; dispatch_async(dispatch_get_main_queue(), ^{ UIImage *image = [UIImage imageWithData:imgData]; if (image) { // 先缓存图片到内存 // [imageCache cacheImageToMemory:image forKey:imageUrl]; // 再缓存图片到文件系统 NSString *extension = [[imageUrl substringFromIndex:imageUrl.length-3] lowercaseString]; NSString *imageType = @"jpg"; if ([extension isEqualToString:@"jpg"]) { imageType = @"jpg"; }else{ imageType = @"png"; } [imageCache cacheImageToFile:image forKey:imageUrl ofType:imageType]; } if (completeBlock) { completeBlock(image,error,url); } }); }); } +(NSData *)resetSizeOfImageData:(UIImage *)source_image maxSize:(NSInteger)maxSize { //先调整分辨率 CGSize newSize = CGSizeMake(source_image.size.width, source_image.size.height); CGFloat tempHeight = newSize.height / 1024; CGFloat tempWidth = newSize.width / 1024; if (tempWidth > 1.0 && tempWidth > tempHeight) { newSize = CGSizeMake(source_image.size.width / tempWidth, source_image.size.height / tempWidth); } else if (tempHeight > 1.0 && tempWidth < tempHeight){ newSize = CGSizeMake(source_image.size.width / tempHeight, source_image.size.height / tempHeight); } UIGraphicsBeginImageContext(newSize); [source_image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)]; UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); //调整大小 NSData *imageData = UIImageJPEGRepresentation(newImage,1.0); NSUInteger sizeOrigin = [imageData length]; NSUInteger sizeOriginKB = sizeOrigin / 1024; if (sizeOriginKB > maxSize) { NSData *finallImageData = UIImageJPEGRepresentation(newImage,0.5); return finallImageData; } return imageData; } @end