iOS图片的下载缓存全部在此 分类: iOS编程 2012-11-03 21:15 2075人阅读 评论(2) 收藏 举报 注意: 我的文章只写给自己看 ---------------------------------------------------------------------------------------- (一)这部分(感觉out了), 但是还是保留, 算是学习的痕迹. ---------------------------------------------------------------------------------------- (1)最简单的下载,显示图片的方法: [plain] view plaincopy UIImageView *imageView = [[UIImageView alloc] initWithFrame:[self.view bounds]]; imageView.image = [self loadImageFromUrl:@"http://storage.live.com/items/72A00BF5A838647C!1616?filename=meinv004.jpg"]; [self.view addSubview:imageView]; -(UIImage*)loadImageFromUrl: (NSString*)url { NSURL *imageUrl = [NSURL URLWithString:url]; NSData *imageData = [NSData dataWithContentsOfURL:imageUrl]; UIImage *image = [UIImage imageWithData:imageData]; return image; } 这种最简单的图片加载方式阻塞了main线程. 使得流程不能流畅进行. (2)开辟线程来解决这个问题. [plain] view plaincopy // set imageview UIImageView *imageView = [[UIImageView alloc] initWithFrame:[self.view bounds]]; imageView.backgroundColor = [UIColor yellowColor]; imageView.tag = imageView_tag; [self.view addSubview:imageView]; // load image in background NSString *url = IMAGE_URL; [self performSelectorInBackground:@selector(loadImageFromUrl:) withObject:url]; -(void)loadImageFromUrl: (NSString*)url { NSURL *imageUrl = [NSURL URLWithString:url]; NSData *imageData = [NSData dataWithContentsOfURL:imageUrl]; [self performSelectorOnMainThread:@selector(updateImageView:) withObject:imageData waitUntilDone:NO]; } -(void) updateImageView:(NSData*) data { UIImageView *imageView = (UIImageView *)[self.view viewWithTag:imageView_tag]; imageView.image = [UIImage imageWithData:data]; } 并且只能在main线程中设置UI的内容, 所以代码量增加了较多. 代码量暂且不管, 这里还有一个比较严重的问题就是每次都要加载图片, 使用SDWebImage: [plain] view plaincopy #import <SDWebImage/UIImageView+WebCache.h> [imageView setImageWithURL:[NSURL URLWithString:[_objects objectAtIndex:indexPath.row]] placeholderImage:[UIImage imageNamed:@"placeholder.png"]]; SDWebImage可以实现: *下载和缓存图片. *相同的url不会被重复下载. *坏的url不会一直请求. 使用HJCache: [plain] view plaincopy // 目前HJCache不支持ARC, 所以这是个问题. ----------------------------------------------------------------------------------------------------------------- (二)多线程初步实现TableView的图片显示(之前用第三库老是不稳定) 这个算是比较满意的. ------------------------------------------------------------------------------------------------------------------------ [plain] view plaincopy @interface c:NSOperation @property NSString *url; @property NSString *imageName; @property UIImage *image; @property UIImageView *delegate; -(void) main; -(id) initWith:(NSString *)url imageName:(NSString *)imageName delegate:(UIImageView *)delegate; @end @implementation c:NSOperation @synthesize url = _url,imageName=_imageName, image=_image, delegate=_delegate; -(id) initWith:(NSString *)url imageName:(NSString *)imageName delegate:(UIImageView *)delegate{ if (self = [super init]) { self.url = url; self.imageName = imageName; self.delegate = delegate; } return self; } -(void) main{ // NSString *cachefile = [NSTemporaryDirectory() stringByAppendingPathComponent: self.imageName]; NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:self.url]]; [data writeToFile:cachefile atomically:YES]; // self.image = [UIImage imageWithData:data]; [self performSelectorOnMainThread:@selector(u) withObject:nil waitUntilDone:NO]; } -(void)u{ [self.delegate setImage:self.image]; } [plain] view plaincopy queue = [[NSOperationQueue alloc] init];//这是成员队列的实例化 设置TableView cell中的图片: [plain] view plaincopy NSString *filename = [NSString stringWithFormat:@"%d", indexPath.row]; NSString *cachefile = [NSTemporaryDirectory() stringByAppendingPathComponent: filename]; UIImage *image = [UIImage imageWithContentsOfFile:cachefile]; if (image) { cell.imageView.image = image; } else { c *o = [[c alloc] initWith:[_objects objectAtIndex:indexPath.row] imageName:[NSString stringWithFormat:@"%d",indexPath.row] delegate:cell.imageView]; [queue addOperation:o]; cell.imageView.image= [UIImage imageNamed:@"placeholder.png"]; } 注: 保存一下测试图片 urls
http://blog.csdn.net/deep_explore/article/details/8144613
原网址