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

         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

原网址

posted on 2013-12-10 17:18  ACM_Someone like you  阅读(902)  评论(0编辑  收藏  举报

导航