您的位置:首页 > 其它

使用SDWebImage下载缓存

2013-03-25 21:41 423 查看


iOS图片的下载缓存

----------------------------------------------------------------------------------------

基础部分

----------------------------------------------------------------------------------------

(1)最简单的下载,显示图片的方法:

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)开辟线程来解决这个问题.

// 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:

#import <SDWebImage/UIImageView+WebCache.h>

[imageView setImageWithURL:[NSURL URLWithString:[_objects objectAtIndex:indexPath.row]]

placeholderImage:[UIImage imageNamed:@"placeholder.png"]];

SDWebImage可以实现:

*下载和缓存图片.

*相同的url不会被重复下载.

*坏的url不会一直请求.

使用HJCache:

// 目前HJCache不支持ARC, 所以这是个问题.

-----------------------------------------------------------------------------------------------------------------
多线程初步实现TableView的图片显示

------------------------------------------------------------------------------------------------------------------------

@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];

}

queue = [[NSOperationQueue alloc] init];//这是成员队列的实例化

设置TableView cell中的图片:

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"];

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: