zoukankan      html  css  js  c++  java
  • 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

    原网址

  • 相关阅读:
    hdu 3666 差分约束系统
    hdu 1198农田灌溉
    常微分方程(阿諾爾德) Page 45 相空間,相流,運動,相曲線 註記
    高等微積分(高木貞治) 1.4節 例2
    常微分方程(阿諾爾德) Page 45 相空間,相流,運動,相曲線 註記
    解析函數論 Page 29 命題(2) 函數模的有界性
    高等微積分(高木貞治) 1.4節 例2
    解析函數論 Page 29 命題(1) 有界閉集上的一致連續性
    解析函數論 Page 29 命題(3) 模的下界的可達性
    解析函數論 Page 29 命題(2) 函數模的有界性
  • 原文地址:https://www.cnblogs.com/someonelikeyou/p/3467845.html
Copyright © 2011-2022 走看看