iOS图片的下载缓存全部在此

本文介绍了iOS中图片的下载和缓存方法,包括最简单的图片加载策略和多线程在TableView图片显示中的应用,提供了稳定性的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注意: 我的文章只写给自己看

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

(一)这部分(感觉out了), 但是还是保留,  算是学习的痕迹.

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

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


注: 保存一下测试图片  urls



















评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值