在开发移动应用的时候好比Android,IOS,由于手机流量、网速、内存等这些因素,当咱们的移动应用是针对互联网,并要频繁访问网络的话,对网络优化这块就显得尤其重要了。数组
好比某个应用要常常显示网络图片,就不能每次显示图片都去网络上下载,那太耗费时间也太耗费流量,这时就要对网络图片进行缓存了,如下是我对IOS网络图片缓存的一些看法,有不足之处,欢迎你们指出来,一块儿探讨。缓存
处理网络图片缓存步骤:网络
一、根据图片URL查找内存是否有这张图片,有则返回图片,没有则进入第二步app
二、查找物理存储是否有这张图片,有则返回图片,没有则进入第三步异步
三、从网络上下载该图片,下载完后保存到内存和物理存储上,并返回该图片oop
注:由于URL包含特殊字符和长度不肯定,要对URL进行MD5处理或其余处理优化
下面是针对以上步骤的代码讲解:spa
一、内存缓存图片处理.net
使用NSMutableDictionary存储图片UIImage,数组的Key为该图片的URL地址code
//缓存图片到内存上
- [memCache setObject:image forKey:key];
二、物理缓存图片处理把图片保持到物理存储设备上,则直接使用NSFileManager,把URL做为文件名保存
三、网络图片下载处理
图片使用异步下载,下载完后把图片保持到NSMutableDictionary和物理存储上
如下是摘自SDWebImageleik网络图片缓存处理的一个类,有详细注释
.h文件
@interface SDImageCache : NSObject { NSMutableDictionary *memCache;//内存缓存图片引用 NSString *diskCachePath;//物理缓存路径 NSOperationQueue *cacheInQueue, *cacheOutQueue; } + (SDImageCache *)sharedImageCache; //保存图片 - (void)storeImage:(UIImage *)image forKey:(NSString *)key; //保存图片,并选择是否保存到物理存储上 - (void)storeImage:(UIImage *)image forKey:(NSString *)key toDisk:(BOOL)toDisk; //保存图片,能够选择把NSData数据保存到物理存储上 - (void)storeImage:(UIImage *)image imageData:(NSData *)data forKey:(NSString *)key toDisk:(BOOL)toDisk; //经过key返回UIImage - (UIImage *)imageFromKey:(NSString *)key; //若是获取内存图片失败,是否能够在物理存储上查找 - (UIImage *)imageFromKey:(NSString *)key fromDisk:(BOOL)fromDisk; - (void)queryDiskCacheForKey:(NSString *)key delegate:(id <SDImageCacheDelegate>)delegate userInfo:(NSDictionary *)info; //清除key索引的图片 - (void)removeImageForKey:(NSString *)key; //清除内存图片 - (void)clearMemory; //清除物理缓存 - (void)clearDisk; //清除过时物理缓存 - (void)cleanDisk; @end