• 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

    原网址

  • 相关阅读:
    浅谈java中异常处理
    Android四大组件之BroadcastReceiver
    android基本组件 Button
    Android基本组件TextView和EditView
    Unicode,GBK和UTF8
    记一次生产上的紧急修复之后解疑过程
    使用第三方jar时出现的问题
    码农歌单
    创建servlet程序知识点详解---servlet-day12
    创建servlet程序知识点详解---servlet-day07
  • 原文地址:https://www.cnblogs.com/someonelikeyou/p/3467845.html
Copyright © 2020-2023  润新知