iOS图片的下载缓存全部在此
分类: iOS编程 -- : 2075人阅读 评论() 收藏 举报
注意: 我的文章只写给自己看
----------------------------------------------------------------------------------------
(一)这部分(感觉out了), 但是还是保留, 算是学习的痕迹.
----------------------------------------------------------------------------------------
()最简单的下载,显示图片的方法:
[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线程. 使得流程不能流畅进行. ()开辟线程来解决这个问题. [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
原网址