tableview 图片缓存

需要对图片进行缓存 写入沙盒中,使用多线程下载图将队列放到字典中,value 线程 key 下载路径 判断是否有该key 没有创建添加一个线程下载

赋值图片只需刷新对应cell 就可以

@property(nonatomic,strong)NSMutableDictionary * imageCache;
@property(nonatomic,strong)NSMutableDictionary * operations;
@property(nonatomic,strong)NSOperationQueue * queue;

-(NSOperationQueue *)queue
{
    if (!_queue) {
        _queue=[[NSOperationQueue alloc]init];
    }
    return _queue;
}
-(NSMutableDictionary *)operations
{
    if (!_operations) {
        _operations=[NSMutableDictionary dictionary];
    }
    return _operations;
}
-(NSMutableDictionary *)imageCache{
    if (!_imageCache) {
        _imageCache=[NSMutableDictionary dictionary];
    }
    return _imageCache;
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
//    CarTableViewCell *cell=[[CarTableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"int"];
    
    
    static NSString* [email protected]"app";
    CarTableViewCell * cell=[tableView dequeueReusableCellWithIdentifier:ID];
    
    if (!cell) {
        cell=[[CarTableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];
    }
   
    
    if (allDataArray.count>0) {
    NSDictionary * unit=[allDataArray objectAtIndex:indexPath.row];
    cell.titleName.text=[NSString stringWithFormat:@"%@ %@",[unit objectForKey:@"carcName"],[unit objectForKey:@"carkName"]];
    cell.timeAndDistance.text=[NSString stringWithFormat:@"%@/%@公里数",[unit objectForKey:@"inspectionDate"],[unit objectForKey:@"mileage"]];
    cell.money.text=[NSString stringWithFormat:@"%@万",[unit objectForKey:@"price"]];
    NSString *imagearr=[unit objectForKey:@"img"];
    NSArray * arr=[imagearr componentsSeparatedByString:@";"];
        
       
        NSString * path=[NSString stringWithFormat:@"http://121.201.18.34:8080/CAR/upload/car/%@",arr[0]];
        
        UIImage * image=self.imageCache[path];
        if (image) {
            cell.CarImageView.image=image;
        }else {
            
            NSString * cachesPath=[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
            NSString * filename=[path lastPathComponent];
            //计算文件的全路径
            NSString * file =[cachesPath stringByAppendingPathComponent:filename];
            //加载沙盒的文件数据
            NSData * data=[NSData dataWithContentsOfFile:file];
            NSLog(@"%@",file);
            if (data) {
                UIImage * image=[UIImage imageWithData:data];
                cell.CarImageView.image=image;
                
            }else{
                NSOperation * operation = self.operations[path];
                if (operation==nil) {
                    operation=[NSBlockOperation blockOperationWithBlock:^{
                        //下载图片
                        NSData * data=[NSData dataWithContentsOfURL:[NSURL URLWithString:path]];
                        
                        //数据加载失败
                        if (data==nil) {
                            //移除操作
                            [self.operations removeObjectForKey:path];
                            return ;
                        }
                        
                        
                        UIImage * image=[UIImage imageWithData:data];
                        //回到主线程显示图片
                        [[NSOperationQueue mainQueue]addOperationWithBlock:^{
                            [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
                        }];
                        //存放到字典中
                        self.imageCache[path]=image;
                        //将图片写到沙盒中
                        [data writeToFile:file atomically:YES];
                        
                    }];
                    self.operations[path]=operation;
                    [self.queue addOperation:operation];
                }
            }
            
            
        }
        
//    [cell.CarImageView sd_setImageWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://121.201.18.34:8080/CAR/upload/car/%@",arr[0]]]];
    }
    return cell;
}

时间: 2024-10-25 08:23:08

tableview 图片缓存的相关文章

【iOS】网络加载图片缓存与SDWebImage

加载网络图片可以说是网络应用中必备的.如果单纯的去下载图片,而不去做多线程.缓存等技术去优化,加载图片时的效果与用户体验就会很差. 一.自己实现加载图片的方法 tips: *iOS中所有网络访问都是异步的.(自己开线程去下载) *普通为模型增加UIImage属性的方法做的是内存缓存(下次启动还需要从网络重新加载), 而要做本地缓存的话,还要自己手动存储网络上下载的图片. *为了加快访问, 还需要自己去弄缓存.(内存缓存或者本地缓存) *当图片没有下载完成时,还要设置占位图片. 以下代码用NSOp

清除图片缓存

?- (void)setupGroup1 { // 1.创建组 LKCommonGroup *group = [LKCommonGroup group]; [self.groups addObject:group]; // 2.设置组的所有行数据 LKCommonArrowItem *clearCache = [LKCommonArrowItem itemWithTitle:@"清除图片缓存"]; // 设置缓存的大小 //    NSString *caches = [NSSearc

Android:ViewPager扩展详解——带有导航的ViewPagerIndicator(附带图片缓存,异步加载图片)

大家都用过viewpager了, github上有对viewpager进行扩展,导航风格更加丰富,这个开源项目是ViewPagerIndicator,很好用,但是例子比较简单,实际用起来要进行很多扩展,比如在fragment里进行图片缓存和图片异步加载. 下面是ViewPagerIndicator源码运行后的效果,大家也都看过了,我多此一举截几张图: 下载源码请点击这里 ===========================================华丽的分割线==============

麦子学院ios笔记:IOS把图片缓存到本地的几种方法

把ios的图片缓存到本地的方法有几种?现在来看看学生在麦子学院学习ios开发的笔记中有讲到哪几种方法呢? <code>把图片缓存到本地,在很多场景都会用到,如果是只储存文字信息,那建一个plist文件,或者数据库就能很方便的解决问题,但是如果存图片到沙盒就没那么方便了.这里介绍两种保存图片到沙盒的方法. </code> 一.把图片转为base64的字符串存到数据库中或者plist文件中,然后用到的时候再取出来 <code class="hljs" obje

AFN清除图片缓存 以及菊花转圈

AFNetworking网络库已经提供了很好的图片缓存机制,效率是比较高的,但是我发现没有直接提供清除缓存的功能,可项目通常都需要添加 清除功能的功能,因此,在这里我以UIImageView+AFNetworking类中添加了下面一个清除功能方法: [objc] view plaincopyprint? /** Clear image cache author: huangyibiao */ + (void)clearCache; [objc] view plaincopyprint? /**

Android图片缓存分析(一)

Android中写应用时,经常会遇到加载图片的事,由于很多图片是网络上下载获取的,当我们进页面时,便会去网络下载图片,一两次可能没啥问题,但如果同一张图片每次都去网络拉取,不仅速度慢,更影响用户体验,同时会浪费用户的流量. 基于此,很多人便想到了图片缓存的方法. 现在比较普遍的图片缓存主要有以下几个步骤: 一.从缓存中获取图片 二.如果缓存中未获取图片,则从存储卡中获取 三.如果存储卡中未获取图片,则从网络中获取 一.从缓存中获取图片 我们知道,Android中分配给每个应用的内存空间是有限的,

图片缓存策略

图片缓存策略 1.图片缓存策略分析 从网络上加载一张图,然后把它显示到UI上是个很简单的事情.当图片变多时,处理起来就有些麻烦了,很典型的应用场景,如ListView,GridView或者ViePager等.我们既需要保证用户看到更多的图片,以免屏幕出现大面积的空白,又要保证内存能Hold住. GC会自动释放一个没有强引用的图片或者View,这本来是个好事情,但为了让用户来回滚动时还能快速加载老图片,通常会使用图片缓存. 下面分别讨论下,通过使用Memory Cache和Disk Cache来增

Android 开源框架Universal-Image-Loader完全解析(二)--- 图片缓存策略详解

本篇文章继续为大家介绍Universal-Image-Loader这个开源的图片加载框架,介绍的是图片缓存策略方面的,如果大家对这个开源框架的使用还不了解,大家可以看看我之前写的一篇文章Android 开源框架Universal-Image-Loader完全解析(一)--- 基本介绍及使用,我们一般去加载大量的图片的时候,都会做缓存策略,缓存又分为内存缓存和硬盘缓存,我之前也写了几篇异步加载大量图片的文章,使用的内存缓存是LruCache这个类,LRU是Least Recently Used 近

Android公共库——图片缓存 网络缓存 下拉及底部更多ListView 公共类

Android公共库--图片缓存 网络缓存 下拉及底部更多ListView 公共类 转载自http://www.trinea.cn/android/android-common-lib/ 介绍总结的一些android公共库,包含缓存(图片缓存.预取缓存.网络缓存).公共View(下拉及底部加载更多ListView.底部加载更多ScrollView.滑动一页Gallery).及Android常用工具类(网络.下载.shell.文件.json等等). TrineaAndroidCommon已开源,地