在開發移動應用的時候好比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