一 .功能簡介:
1膘流、一個(gè)添加了web圖片加載和緩存管理的UIImageView分類
2湿蛔、一個(gè)異步圖片下載器
3棋嘲、一個(gè)異步的內(nèi)存加磁盤綜合存儲(chǔ)圖片并且自動(dòng)處理過期圖片
4、支持動(dòng)態(tài)gif圖
5、支持webP格式的圖片
6流译、后臺(tái)圖片解壓處理
7逞怨、確保同樣的圖片url不會(huì)下載多次
8、確保偽造的圖片url不會(huì)重復(fù)嘗試下載
9福澡、確保主線程不會(huì)阻塞
鏈接:http://www.reibang.com/p/13c0cdc7987e
二. 基本使用
[cell.imageView sd_setImageWithURL:[NSURLURLWithString:app.icon] placeholderImage:[UIImageimageNamed:@"placehoder"] options:SDWebImageRetryFailed progress:^(NSIntegerreceivedSize,?NSIntegerexpectedSize) {
//計(jì)算當(dāng)前圖片的下載進(jìn)度?
SDImageCacheType :圖片緩存策略 (不緩存叠赦,內(nèi)存緩存,沙盒緩存)
NSLog(@"%.2f",1.0*receivedSize / expectedSize);?
} completed:^(UIImage*image,?NSError*error, SDImageCacheType cacheType,?NSURL*imageURL) {
?}];
03系統(tǒng)級(jí)內(nèi)存警告如何處理(面試)
//取消當(dāng)前正在進(jìn)行的所有下載操作
[[SDWebImageManager sharedManager] cancelAll];
//清除緩存數(shù)據(jù)(面試)
//cleanDisk:刪除過期的文件數(shù)據(jù)革砸,計(jì)算當(dāng)前未過期的已經(jīng)下載的文件數(shù)據(jù)的大小除秀,如果發(fā)現(xiàn)該數(shù)據(jù)大小大于我們?cè)O(shè)置的最大緩存數(shù)據(jù)大小,那么程序內(nèi)部會(huì)按照按文件數(shù)據(jù)緩存的時(shí)間從遠(yuǎn)到近刪除算利,知道小于最大緩存數(shù)據(jù)為止册踩。
//clearMemory:直接刪除文件,重新創(chuàng)建新的文件夾
//[[SDWebImageManager sharedManager].imageCache cleanDisk];
[[SDWebImageManager sharedManager].imageCache clearMemory];
04. ? ? SDWebImage默認(rèn)的緩存時(shí)間是1周
05. ? ?如何播放gif圖片
/* 5-1 把用戶傳入的gif圖片->NSData?
5-2 根據(jù)該Data創(chuàng)建一個(gè)圖片數(shù)據(jù)源(NSData->CFImageSourceRef)?
5-3 計(jì)算該數(shù)據(jù)源中一共有多少幀效拭,把每一幀數(shù)據(jù)取出來放到圖片數(shù)組中?
5-4 根據(jù)得到的數(shù)組+計(jì)算的動(dòng)畫時(shí)間-》可動(dòng)畫的image [UIImage animatedImageWithImages:images duration:duration]; */
06 . 如何判斷當(dāng)前圖片類型暂吉,只判斷圖片二進(jìn)制數(shù)據(jù)的第一個(gè)字節(jié) + (NSString*)sd_contentTypeForImageData:(NSData*)data;
07. 內(nèi)部如何進(jìn)行緩存處理?使用了NSCache類缎患,使用和NSDictionary類似
08沙盒緩存圖片的命名方式為對(duì)該圖片的URL進(jìn)行MD5加密 echo -n?"url"|MD5
09當(dāng)接收到內(nèi)存警告之后慕的,內(nèi)部會(huì)自動(dòng)清理內(nèi)存緩存
10圖片的下載順序,默認(rèn)是先進(jìn)先出的
鏈接:http://www.reibang.com/p/e7fc5a59f99a
SDWebImageManger是由一個(gè)SDWebImageDownloader(負(fù)責(zé)下載網(wǎng)絡(luò)圖片),SDImageCache(一個(gè)處理緩存的類)共同構(gòu)成的類
SDWebImage提供了如下三個(gè)category來進(jìn)行緩存挤渔。MKAnnotationView + WebCache 地圖大頭針 ? ? ?UIButton + WebCache 給按鈕設(shè)置圖片 ? ?UIImageView + WebCache imageView的圖片
三.工作流程:
詳細(xì)可參看上面鏈接 : 1.首先將placeholderImage進(jìn)行展示,SDWebImageManager根據(jù)URL開始處理圖片 2.SDImageCache從緩存中查找圖片圖片肮街,如果有sdImageCacheDelegate回調(diào)image:didFindImage:forkey:useInfo:到SDWebImageManager .到前端展示圖片 3.緩存中沒有,生成NSInvocationOperation添加到隊(duì)列中開始在硬盤中查找判导,如果找到會(huì)將圖片添加到內(nèi)存緩存中(如果空閑緩存不夠嫉父,會(huì)先清理)然后SDImageCacheDelegate回調(diào)imageCache:didFindImage:forKey:userInfo:。進(jìn)而回調(diào)展示圖片眼刃。4.如果硬盤中沒有則共享或生成下載器SDWebImageDownLoader開始下載圖片绕辖,圖片下載有NSURLConnection來做 ? ? ? ? ? ? 5.圖片解碼處理在一個(gè)NSOperationQueue完成,不會(huì)拖慢主線程UI擂红。如果有需要對(duì)下載的圖片進(jìn)行二次處理引镊,最好也在這里完成,效率會(huì)好很多篮条。6.在主線程notifyDelegateOnMainThreadWithInfo: 宣告解碼完成,imageDecoder:didFinishDecodingImage:userInfo: 回調(diào)給SDWebImageDownloader吩抓。imageDownloader:didFinishWithImage: 回調(diào)給SDWebImageManager告知圖片下載完成 ? ? ? ? ? 7.通知所有的downloadDelegates下載完成涉茧,回調(diào)給需要的地方展示圖片。將圖片保存到SDImageCache中疹娶,內(nèi)存緩存和硬盤緩存同時(shí)保存伴栓。寫文件到硬盤也在以單獨(dú)NSInvocationOperation完成,避免拖慢主線程。8.SDImageCache在初始化的時(shí)候會(huì)注冊(cè)一些消息通知钳垮,在內(nèi)存警告或退到后臺(tái)的時(shí)候清理內(nèi)存圖片緩存惑淳,應(yīng)用結(jié)束的時(shí)候清理過期圖片
四.數(shù)據(jù)管理
SDImageCache分兩個(gè)部分,一個(gè)是內(nèi)存層面的饺窿,一個(gè)是硬盤層面的歧焦。
內(nèi)存層面的相當(dāng)是個(gè)緩存器,以Key-Value的形式存儲(chǔ)圖片肚医。當(dāng)內(nèi)存不夠的時(shí)候會(huì)清除所有緩存圖片绢馍。用搜索文件系統(tǒng)的方式做管理,文件替換方式是以時(shí)間為單位肠套,剔除時(shí)間大于一周的圖片文件舰涌。當(dāng)SDWebImageManager向SDImageCache要資源時(shí),先搜索內(nèi)存層面的數(shù)據(jù)你稚,如果有直接返回瓷耙,沒有的話去訪問磁盤,將圖片從磁盤讀取出來刁赖,然后做Decoder搁痛,將圖片對(duì)象放到內(nèi)存層面做備份,再返回調(diào)用層
clearDisk (NSCache)清空磁盤緩存乾闰,將所有緩存目錄中的文件落追,全部刪除! 實(shí)際工作涯肩,將緩存目錄直接刪除轿钠,再次創(chuàng)建一個(gè)同名空目錄!cleanDisk (接收到應(yīng)用程序?qū)⒁K止通知)清理磁盤緩存策略
cleanDisk執(zhí)行過程:
1.獲取磁盤路徑URL病苗,根據(jù)路徑獲取資源(存入NSArray)
2.定義一個(gè)可變字典疗垛,記錄所有緩存文件
3.定義一個(gè)可變數(shù)組,遍歷資源硫朦,將過期文件記錄到可變數(shù)組里邊贷腕,累加文件的總大小,然后遍歷過期文件數(shù)組刪除過期文件
4.如果剩余磁盤緩存空間超出最大限額咬展,再次執(zhí)行清理操作泽裳,刪除最早的文件 循環(huán)依次刪除文件,直到低于期望的緩存限額破婆,SDWebimage里邊的期望限額為最大限額的一半