更新2013年04月02日11:46:36:修改了用 [imageView setImageWithURLRequest:[NSURLRequestrequestWithURL:[NSURLURLWithString:@""]] placeholderImage:[UIImageimageNamed:@"loader.jpg"] success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {    } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {    }];图片不能缓存的问题

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

ASI好久没更新,于是今天试了下AFNetWorking,调用图片请求方法很方便

    [self.imageViewsetImageWithURL:[NSURLURLWithString:@"http://best50.cn:8080/update/10/food/72.jpg"] placeholderImage:[UIImageimageNamed:@"placeholder.png"]];

但发现个问题,程序重新启动后,图片还要重新请求,原来AFN用的是内存缓存图片机制,这能提高程序效率,但我们有时候,图片的本地缓存也是很重要的,于是,对AFN下UIImageView+AFNetworking.m文件的代码进行了修改,欢迎大家进行指正,修改和添加的方法如下:

  1 - (void)setImageWithURLRequest:(NSURLRequest *)urlRequest
  2               placeholderImage:(UIImage *)placeholderImage
  3                        success:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image))success
  4                        failure:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error))failure
  5 {
  6     [self cancelImageRequestOperation];
  7
  8
  9     UIImage *cachedImage = [[[self class] af_sharedImageCache] cachedImageForRequest:urlRequest];
 10     if (cachedImage) {
 11
 12         self.image = cachedImage;
 13         self.af_imageRequestOperation = nil;
 14
 15         if (success) {
 16             success(nil, nil, cachedImage);
 17         }
 18     } else {
 19         NSString *urlString = [[urlRequest URL] absoluteString];
 20         NSData *data = [self loadImageData:[self pathInCacheDirectory:@"WendaleCache"] imageName:[urlString md5]];
 21         if (data) {
 22             self.image = [UIImage imageWithData:data];
 23             self.af_imageRequestOperation = nil;
 24
 25             if (success) {
 26                 success(nil, nil, self.image);
 27             }
 28             return;
 29         }
 30
 31         self.image = placeholderImage;
 32
 33         AFImageRequestOperation *requestOperation = [[AFImageRequestOperation alloc] initWithRequest:urlRequest];
 34         [requestOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
 35             if ([[urlRequest URL] isEqual:[[self.af_imageRequestOperation request] URL]]) {
 36                 if (success) {
 37                     success(operation.request, operation.response, responseObject);
 38                 }else if (responseObject) {

 39                 self.image = responseObject;}
 40                     //图片本地缓存
 41                 if ([self createDirInCache:@"WendaleCache"]) {
 42                     NSString *imageType = @"jpg";
 43                      //从url中获取图片类型
 44                   NSMutableArray *arr = (NSMutableArray *)[urlString componentsSeparatedByString:@"."];
 45                     if (arr) {
 46                          imageType = [arr objectAtIndex:arr.count-1];
 47                      }
 48                      [self saveImageToCacheDir:[self pathInCacheDirectory:@"WendaleCache"] image: responseObject imageName:[urlString md5] imageType:imageType];
 49                 }
 50
 51
 52  53
 54                 self.af_imageRequestOperation = nil;
 55             }
 56
 57             [[[self class] af_sharedImageCache] cacheImage:responseObject forRequest:urlRequest];
 58
 59         } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
 60             if ([[urlRequest URL] isEqual:[[self.af_imageRequestOperation request] URL]]) {
 61                 if (failure) {
 62                     failure(operation.request, operation.response, error);
 63                 }
 64
 65                 self.af_imageRequestOperation = nil;
 66             }
 67         }];
 68
 69         self.af_imageRequestOperation = requestOperation;
 70
 71         [[[self class] af_sharedImageRequestOperationQueue] addOperation:self.af_imageRequestOperation];
 72     }
 73 }
 74
 75 -(NSString* )pathInCacheDirectory:(NSString *)fileName
 76 {
 77     NSArray *cachePaths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
 78     NSString *cachePath = [cachePaths objectAtIndex:0];
 79     return [cachePath stringByAppendingPathComponent:fileName];
 80 }
 81 //创建缓存文件夹
 82 -(BOOL) createDirInCache:(NSString *)dirName
 83 {
 84     NSString *imageDir = [self pathInCacheDirectory:dirName];
 85     BOOL isDir = NO;
 86     NSFileManager *fileManager = [NSFileManager defaultManager];
 87     BOOL existed = [fileManager fileExistsAtPath:imageDir isDirectory:&isDir];
 88     BOOL isCreated = NO;
 89     if ( !(isDir == YES && existed == YES) )
 90     {
 91         isCreated = [fileManager createDirectoryAtPath:imageDir withIntermediateDirectories:YES attributes:nil error:nil];
 92     }
 93     if (existed) {
 94         isCreated = YES;
 95     }
 96     return isCreated;
 97 }
 98
 99 // 删除图片缓存
100 - (BOOL) deleteDirInCache:(NSString *)dirName
101 {
102     NSString *imageDir = [self pathInCacheDirectory:dirName];
103     BOOL isDir = NO;
104     NSFileManager *fileManager = [NSFileManager defaultManager];
105     BOOL existed = [fileManager fileExistsAtPath:imageDir isDirectory:&isDir];
106     bool isDeleted = false;
107     if ( isDir == YES && existed == YES )
108     {
109         isDeleted = [fileManager removeItemAtPath:imageDir error:nil];
110     }
111
112     return isDeleted;
113 }
114
115 // 图片本地缓存
116 - (BOOL) saveImageToCacheDir:(NSString *)directoryPath  image:(UIImage *)image imageName:(NSString *)imageName imageType:(NSString *)imageType
117 {
118     BOOL isDir = NO;
119     NSFileManager *fileManager = [NSFileManager defaultManager];
120     BOOL existed = [fileManager fileExistsAtPath:directoryPath isDirectory:&isDir];
121     bool isSaved = false;
122     if ( isDir == YES && existed == YES )
123     {
124         if ([[imageType lowercaseString] isEqualToString:@"png"])
125         {
126             isSaved = [UIImagePNGRepresentation(image) writeToFile:[directoryPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@", imageName, @"png"]] options:NSAtomicWrite error:nil];
127         }
128         else if ([[imageType lowercaseString] isEqualToString:@"jpg"] || [[imageType lowercaseString] isEqualToString:@"jpeg"])
129         {
130             isSaved = [UIImageJPEGRepresentation(image, 1.0) writeToFile:[directoryPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@", imageName, @"jpg"]] options:NSAtomicWrite error:nil];
131         }
132         else
133         {
134             NSLog(@"Image Save Failed\nExtension: (%@) is not recognized, use (PNG/JPG)", imageType);
135         }
136     }
137     return isSaved;
138 }
139 // 获取缓存图片
140 -(NSData*) loadImageData:(NSString *)directoryPath imageName:( NSString *)imageName
141 {
142     BOOL isDir = NO;
143     NSFileManager *fileManager = [NSFileManager defaultManager];
144     BOOL dirExisted = [fileManager fileExistsAtPath:directoryPath isDirectory:&isDir];
145     if ( isDir == YES && dirExisted == YES )
146     {
147         NSString *imagePath = [directoryPath stringByAppendingString : imageName];
148         BOOL fileExisted = [fileManager fileExistsAtPath:imagePath];
149         if (!fileExisted) {
150             return NULL;
151         }
152         NSData *imageData = [NSData dataWithContentsOfFile : imagePath];
153         return imageData;
154     }
155     else
156     {
157         return NULL;
158     }
159 }

转载于:https://www.cnblogs.com/Wendale-Zhang/archive/2013/01/17/2864442.html

AFNetworking 图片的本地缓存问题相关推荐

  1. php长按图片保存mui,Vue+mui实现图片的本地缓存

    这篇文章主要介绍了Vue+mui实现图片的本地缓存的实例代码,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下 下面一段代码给大家分享基于Vue+mui实现图片的本地缓存,具体代码如下所示: c ...

  2. php缓存远程图片接口,Android_Android远程获取图片并本地缓存,对于客户端——服务器端应用 - phpStudy...

    Android远程获取图片并本地缓存 对于客户端--服务器端应用,从远程获取图片算是经常要用的一个功能,而图片资源往往会消耗比较大的流量,对应用来说,如果处理不好这个问题,那会让用户很崩溃,不知不觉手 ...

  3. Vue+mui实现图片的本地缓存

    效果: const menu = {state: {products: {},GLOBAL_CONFIG:GLOBAL_CONFIG['GLOBAL_CONFIG']},mutations: {get ...

  4. LruCache缓存图片+清除本地缓存

    /**  *  * 本应用数据清除管理器  */ public class DataClearManager { /**      * 获取本应用缓存大小      * @param context ...

  5. 小程序-图片/文件本地缓存,减少CDN流量消耗

    ♠ 写在前面 小程序网络图片读取: 在读取OSS图片CDN分发时流量大量消耗,导致资金费用增加. 网络图片比较大时,图片加载缓慢. 为了尽量减少上面两个问题,所以对已读的图片进行缓存处理,减少多次访问 ...

  6. Android图片的三级缓存

    图片的三级缓存目的 主要目的是为了节省流量.加快加载速度: 每个 app 都会有大量的网络图片存在,当我们不做处理,每次打开 app 都去加载大量网络图片时,会耗费大量的流量,当网速不好时加载速度很慢 ...

  7. load方法引入本地html报错,分享基于plus.downloader的图片懒加载功能,支持本地缓存v1.1.0...

    今天试用了下hello mui上的图片懒加载功能,发现有些地方还无法满足我的需求,ajax动态加载的时候无法实现懒加载. 然后又看了下36kr的示例,因为代码关系实在太多了,耦合度比较高,遂自己动手写 ...

  8. android-远程图片获取和本地缓存

    概述 对于客户端--服务器端应用,从远程获取图片算是经常要用的一个功能,而图片资源往往会消耗比较大的流量,对应用来说,如果处理不好这个问题,那会让用户很崩溃,不知不觉手机流量就用完了,等用户发现是你的 ...

  9. Android仿人人客户端(v5.7.1)——对从服务器端(网络)获取的图片进行本地双缓存处理(编码实现)...

    转载请标明出处:http://blog.csdn.net/android_ls/article/details/8797740 这篇是基于上一篇Android仿人人客户端(v5.7.1)--对从服务器 ...

  10. Android仿人人客户端(v5.7.1)——对从服务器端(网络)获取的图片进行本地双缓存处理(流程图或活动图)...

    转载请标明出处:http://blog.csdn.net/android_ls/article/details/8785016 对从服务器端获取的图片,本地(Android客户端)进行双缓存处理的业务 ...

最新文章

  1. java_软件发布版本_Asynch HttpClien 对比发行版本说明_Alpha、Beta、RC、GA版本的区别...
  2. ubuntu 安装vsftpd 530 login incorrect
  3. 【Nodejs】记一次图像识别的冒险
  4. 基于matlab的单相pwm逆变电路的仿真研究,基于MATLAB的单相PWM逆变电路的仿真研究...
  5. python游走代码_介绍一个全局最优化的方法:随机游走算法(Random Walk)
  6. 小程序引入的echarts过大如何解决_解决生鲜行业“获客难”的难题,教你如何妙用小程序...
  7. 从零开始入门 K8s | K8s 安全之访问控制
  8. 呼叫中心职场EQ与情绪压力管控(时刻提醒自己!)
  9. EfficientNet细节
  10. 计算机毕业设计php的村镇干部绩效考核系统
  11. H3CSE园区-VLAN配置
  12. 解决WIN7无法安装Axure9的问题
  13. MATLAB 绘图分开插入图例
  14. hdu2243之AC自动机+矩阵乘法
  15. 剑网3服务器延迟高,关于《剑网3》网络延迟的一些理论分析
  16. opencv26:霍夫直线变换
  17. (大集合)Linux进程和线程的基本编程、通讯和例程【杂记】
  18. OCP-V13-700
  19. 【Unity面试】 C#语言基础核心 | 面试真题 | 全面总结 | 建议收藏
  20. libcurl模拟hi百度登陆

热门文章

  1. mac版有道云笔记切换笔记后内容仍展示前一个笔记内容问题解决
  2. 通过Google分析页面加载缓慢并优化
  3. 地图比例尺与空间分辨率之间的关系_宝马如何查看自己的车机系统是不是idrive几的?宝马主机与idrive系统和导航地图之间的对应关系!...
  4. XMLHttpRequest发送POST请求
  5. Hibernate多列作为联合主键(六)
  6. 【渝粤教育】国家开放大学2018年秋季 1141t工程经济与管理 参考试题
  7. Eclipse的工作空间与项目
  8. 如何通俗易懂地理解基于模型的强化学习?
  9. linux-ssh免密登录
  10. Java面向对象之多态(向上、向下转型) 入门实例