iOS 图片加载方法

来源:互联网 发布:java开发工程师工资水平 编辑:程序博客网 时间:2024/05/16 12:20

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

[plain] view plaincopy
  1.    UIImageView *imageView = [[UIImageView alloc] initWithFrame:[self.view bounds]];  
  2.    imageView.image = [self loadImageFromUrl:@"http://storage.live.com/items/72A00BF5A838647C!1616?filename=meinv004.jpg"];  
  3.    [self.view addSubview:imageView];  
  4.      
  5.    -(UIImage*)loadImageFromUrl: (NSString*)url  
  6. {  
  7.     NSURL  *imageUrl = [NSURL URLWithString:url];  
  8.     NSData *imageData = [NSData dataWithContentsOfURL:imageUrl];  
  9.     UIImage *image = [UIImage imageWithData:imageData];  
  10.     return image;  
  11. }  
    
这种最简单的图片加载方式阻塞了main线程. 使得流程不能流畅进行.


(2)开辟线程来解决这个问题.

[plain] view plaincopy
  1.    // set imageview  
  2.    UIImageView *imageView = [[UIImageView alloc] initWithFrame:[self.view bounds]];  
  3.    imageView.backgroundColor = [UIColor yellowColor];  
  4.    imageView.tag = imageView_tag;  
  5.    [self.view addSubview:imageView];  
  6.      
  7.    // load image in background  
  8.    NSString *url = IMAGE_URL;  
  9.    [self performSelectorInBackground:@selector(loadImageFromUrl:) withObject:url];  
  10.      
  11.   
  12.   
  13. -(void)loadImageFromUrl: (NSString*)url {  
  14.     NSURL  *imageUrl = [NSURL URLWithString:url];  
  15.     NSData *imageData = [NSData dataWithContentsOfURL:imageUrl];  
  16.     [self performSelectorOnMainThread:@selector(updateImageView:) withObject:imageData waitUntilDone:NO];  
  17. }  
  18. -(void) updateImageView:(NSData*) data {  
  19.     UIImageView *imageView = (UIImageView *)[self.view viewWithTag:imageView_tag];  
  20.     imageView.image = [UIImage imageWithData:data];  
  21. }  


并且只能在main线程中设置UI的内容, 所以代码量增加了较多. 代码量暂且不管, 这里还有一个比较严重的问题就是每次都要加载图片, 


使用SDWebImage: 
[plain] view plaincopy
  1. #import <SDWebImage/UIImageView+WebCache.h>  
  2. [imageView setImageWithURL:[NSURL URLWithString:[_objects objectAtIndex:indexPath.row]]  
  3.                   placeholderImage:[UIImage imageNamed:@"placeholder.png"]];  
SDWebImage可以实现: 
*下载和缓存图片.
*相同的url不会被重复下载.

*坏的url不会一直请求.


使用HJCache:

[plain] view plaincopy
  1. // 目前HJCache不支持ARC, 所以这是个问题.  


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

(二)多线程初步实现TableView的图片显示(之前用第三库老是不稳定) 这个算是比较满意的.

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

[plain] view plaincopy
  1. @interface c:NSOperation  
  2.   
  3. @property NSString *url;  
  4. @property NSString *imageName;  
  5. @property UIImage *image;  
  6. @property UIImageView *delegate;  
  7.   
  8. -(void) main;  
  9. -(id) initWith:(NSString *)url imageName:(NSString *)imageName delegate:(UIImageView *)delegate;  
  10.   
  11. @end  
  12.   
  13. @implementation c:NSOperation  
  14. @synthesize url = _url,imageName=_imageName, image=_image, delegate=_delegate;  
  15.   
  16. -(id) initWith:(NSString *)url imageName:(NSString *)imageName delegate:(UIImageView *)delegate{  
  17.     if (self = [super init]) {  
  18.         self.url = url;  
  19.         self.imageName = imageName;  
  20.         self.delegate = delegate;  
  21.     }  
  22.     return self;  
  23. }  
  24.   
  25. -(void) main{  
  26.     //  
  27.     NSString *cachefile = [NSTemporaryDirectory() stringByAppendingPathComponent: self.imageName];  
  28.     NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:self.url]];  
  29.     [data writeToFile:cachefile atomically:YES];  
  30.       
  31.     //  
  32.     self.image = [UIImage imageWithData:data];  
  33.     [self performSelectorOnMainThread:@selector(u) withObject:nil waitUntilDone:NO];  
  34. }  
  35. -(void)u{  
  36.     [self.delegate setImage:self.image];  
  37. }  

[plain] view plaincopy
  1. queue = [[NSOperationQueue alloc] init];//这是成员队列的实例化  

设置TableView cell中的图片:

[plain] view plaincopy
  1. NSString *filename = [NSString stringWithFormat:@"%d", indexPath.row];  
  2. NSString *cachefile = [NSTemporaryDirectory() stringByAppendingPathComponent: filename];  
  3. UIImage *image = [UIImage imageWithContentsOfFile:cachefile];  
  4. if (image) {  
  5.     cell.imageView.image = image;  
  6. } else {  
  7.     c *o = [[c alloc] initWith:[_objects objectAtIndex:indexPath.row] imageName:[NSString stringWithFormat:@"%d",indexPath.row] delegate:cell.imageView];  
  8.     [queue addOperation:o];  
  9.     cell.imageView.image= [UIImage imageNamed:@"placeholder.png"];  
  10. }  
0 0
原创粉丝点击