SDWebImage 圖片緩存框架 常用方法及原理

常見面試題:

1.SDWebImage的最大并發(fā)數(shù)是多少讼育?

_downloadQueue.maxConcurrentOperationCount = 6;

2.SDWebImages是如何識別圖片的识补?

NSData+ImageContentType.m中西设,根據(jù)圖片文件十六進制數(shù)據(jù)的第一個字節(jié)判斷

圖片的十六進制第一個字節(jié)
3.SDWebImage 緩存圖片命名規(guī)則聊品?

為了防止名稱重復(fù)棺克,對其進行 md5 運算

4.默認下載的超時時長是多少诉瓦?

15秒

5.默認緩存的時間茬腿?

一周

_maxCacheAge = kDefaultCacheMaxCacheAge;static const NSInteger kDefaultCacheMaxCacheAge = 60 60 24 * 7; // 1 week.
SDWebImage用什么類型緩存圖片聚至?

NSCacheSDImageCache內(nèi)處理內(nèi)存警告慧瘤,以通知的方式戴已,clearMemory
cleanDisk的執(zhí)行過程i. 先遍歷所有的緩存文件膳凝,記錄過期的文件,計算緩存文件的總大小ii. 刪除過期的文件iii. 判斷maxCacheSize的值是否>0恭陡,如果大于0再判斷緩存的文件總大小是否大于maxCacheSizeiv.如果緩存文件的總大小超過maxCacheSize蹬音,刪除最早的文件注意:.jpg、.gif等文件需要把擴展名填上休玩,png不需要

常用方法


一著淆、下載緩存

- (NSURL *)sd_imageURL;
下載網(wǎng)絡(luò)圖片并緩存
  1.- (void)sd_setImageWithURL:(NSURL *)url;
  2.- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder;
  3.- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options;

4.下載圖片的線程執(zhí)行完后回調(diào)

- (void)sd_setImageWithURL:(NSURL *)url completed: (SDWebImageCompletionBlock)completedBlock;
    • (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletionBlock)completedBlock;
    • (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletionBlock)completedBlock;

7.下載圖片并獲取圖片下載進度 progressBlock

- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:  (UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock;

例子:下載圖片并且打印圖片的下載進度

NSURL *url = [NSURL URLWithString:@"http://picview01.baomihua.com/photos/20120624/m_14_634761470842343750_15728444.jpg"]; 
[self.imageView sd_setImageWithURL:url placeholderImage:nil options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) {
//乘1.0是為了轉(zhuǎn)換成float類型
float progress = receivedSize * 1.0 / expectedSize;
NSLog(@"下載進度 %f",progress);
} completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
NSLog(@"完成");
}];

8.先從本地緩存中查找請求的圖片,如果有先用本地圖片占位拴疤,再從服務(wù)器請求下載圖片

- (void)sd_setImageWithPreviousCachedImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock;

9.下載一組動畫圖片永部,并自動播放動畫(arrayOfURLs為一組圖片的地址數(shù)組)

- (void)sd_setAnimationImagesWithURLs:(NSArray *)arrayOfURLs;

10.取消當(dāng)前下載

- (void)sd_cancelCurrentAnimationImagesLoad;

12.設(shè)置是否顯示活的指示器以及樣式
注意:必須在請求下載圖片之前給UIImageView設(shè)置!不然無法顯示呐矾!

- (void)setShowActivityIndicatorView:(BOOL)show;
- (void)setIndicatorStyle:(UIActivityIndicatorViewStyle)style;

二苔埋、 UIButton的類擴展


import "UIButton+WebCache.h"

1.獲取當(dāng)前按鈕圖片的地址

- (NSURL *)sd_currentImageURL;

2.獲取指定狀態(tài)下按鈕圖片地址

- (NSURL *)sd_imageURLForState:(UIControlState)state;

3.設(shè)置不同UIControlState狀態(tài)下的按鈕圖片

- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state;
- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder;
- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options;
- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state completed:(SDWebImageCompletionBlock)completedBlock;
- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletionBlock)completedBlock;
- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletionBlock)completedBlock;

1.設(shè)置不同狀態(tài)的按鈕背景圖片

- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state;
- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder;
- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options;
- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state completed:(SDWebImageCompletionBlock)completedBlock;

-(void)sd_setBackgroundImageWithURL:(NSURL )url forState:(UIControlState)state placeholderImage:(UIImage )placeholder completed:(SDWebImageCompletionBlock)completedBlock;
- (void)sd_setBackgroundImageWithURL:(NSURL )url forState:(UIControlState)state placeholderImage:(UIImage )placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletionBlock)completedBlock;

5.取消當(dāng)前指定狀態(tài)按鈕圖片下載

- (void)sd_cancelImageLoadForState:(UIControlState)state;

6.取消當(dāng)前指定狀態(tài)按鈕背景圖片下載

- (void)sd_cancelBackgroundImageLoadForState:(UIControlState)state;

三、參數(shù)介紹


options 枚舉:

1.SDWebImageRetryFailed 失敗后重試蜒犯, 默認如果下載失敗,這個url會被加入黑名單并且不會嘗試再次下載,設(shè)置這個枚舉會阻止把失敗的url加入黑名單组橄,不斷嘗試重新下載。

2.SDWebImageLowPriority 延遲下載罚随, 默認情況下,圖片會在交互 發(fā)生的時候下載(例如你滑動tableview的時候),這個枚舉會禁止這個特性,導(dǎo)致的結(jié)果就是在scrollview減速的時候才會開始下載(也就是你滑動的時候scrollview不下載,你手從屏幕上移走,scrollview開始減速的時候才會開始下載圖片)玉工。

3.SDWebImageCacheMemoryOnly 只在內(nèi)存緩存。

4.SDWebImageProgressiveDownload 漸進式下載,顯示的圖像是逐步在下載淘菩。

5.SDWebImageRefreshCached 刷新緩存遵班,有時本地圖片更新后與服務(wù)器沒有同步一致時可以使用(例如更新頭像),專門處理相同url潮改,但不同image的情況的狭郑。

原因:默認情況下,SDWebImage會忽略Header中的緩存設(shè)置汇在,將圖片以url為key進行保存翰萨,url與圖片是一一對應(yīng)關(guān)系。所以請求同一個url時趾疚,SDWebImage會從緩存中取得圖片缨历。一般的情況下用此方法可以滿足我們的應(yīng)用要求,但是如果你請求同一個url糙麦,而這張圖片在服務(wù)器端更新了辛孵,本地客戶端再次請求時還是會返回緩存中的舊圖片,例如加載頭像類經(jīng)常更新的圖片時赡磅,就會出現(xiàn)頭像不能更新的問題魄缚,由于url與圖片一一對應(yīng),一種解決的辦法是改變部分url地址方式實現(xiàn)更新,不過這種方法操作起來很復(fù)雜冶匹, 另一種將第三個參數(shù)設(shè)置為SDWebImageRefreshCached就可以實現(xiàn)圖片更新操作了习劫。

6.SDWebImageContinueInBackground 啟動后臺下載,app進入后臺后繼續(xù)下載嚼隘。

7.SDWebImageHandleCookies 處理存儲在NSHTTPCookieStore中的cookie诽里。

NSMutableURLRequest.HTTPShouldHandleCookies = YES;

8.SDWebImageAllowInvalidSSLCertificates 允許使用無效的SSL證書,主要用于測試目的飞蛹,在正式環(huán)境中慎用谤狡。

9.SDWebImageHighPriority 優(yōu)先下載。

10.SDWebImageDelayPlaceholder 等待下載完成后再顯示占位圖片卧檐,延遲顯示占位圖片墓懂。

11.SDWebImageTransformAnimatedImage 改變動畫形象。

12.SDWebImageAvoidAutoSetImage 下載完成后手動設(shè)置圖片霉囚,默認是下載完成后自動放到ImageView上捕仔。

SDWebImageCompletionBlock
typedef void(^SDWebImageCompletionBlock)(UIImage image, NSError error, SDImageCacheType cacheType, NSURL imageURL);
參數(shù):(1)請求的圖片
     (2)請求圖片為空的錯誤
     (3) SDImageCacheType 緩存類型,下次是從網(wǎng)上獲取還是從本地獲取盈罐, 枚舉:SDImageCacheTypeNone 永不緩存榜跌,但是從網(wǎng)上下載SDImageCacheTypeDisk 只緩存到磁盤上SDImageCacheTypeMemory 只緩存到內(nèi)存中
     (4)圖片的網(wǎng)絡(luò)地址

SDWebImageDownloaderProgressBlock
typedef void(^SDWebImageDownloaderProgressBlock)(NSInteger receivedSize, NSInteger expectedSize);progress 參數(shù):receivedSize 接收到的字節(jié)數(shù)expectedSize 期望下載的字節(jié)數(shù)//乘1.0是為了轉(zhuǎn)換成float類型float progress = receivedSize 1.0 / expectedSize;

四、本地緩存


介紹:很多時候我們可能拍照得到的一張圖片要多個地方使用暖呕,那么我們就希望可以把這張圖片放到緩存里面斜做,然后每次用這張圖片的時候就去通過特定的方式取即可。

1.屬性:
1.是否壓縮圖片
@property (assign, nonatomic) BOOL shouldDecompressImages;

2.是否禁用iCloud湾揽,默認YES
@property (assign, nonatomic) BOOL shouldDisableiCloud;

3.是否緩存到內(nèi)存,默認YES
@property (assign, nonatomic) BOOL shouldCacheImagesInMemory;

4.最大緩存成本笼吟,針對內(nèi)存
@property (assign, nonatomic) NSUInteger maxMemoryCost;

5.最大緩存?zhèn)€數(shù)库物,針對內(nèi)存
@property (assign, nonatomic) NSUInteger maxMemoryCountLimit;

6.最大緩存時間,單位:秒贷帮,針對磁盤緩存戚揭,默認是一周,自動把一星期以前緩存的圖片刪除掉
@property (assign, nonatomic) NSInteger maxCacheAge;

7.最大緩存大小撵枢,單位字節(jié)民晒,針對磁盤,默認無限制0锄禽,需要自己設(shè)置
@property (assign, nonatomic) NSUInteger maxCacheSize;
2.創(chuàng)建緩存空間
1.在沙盒的cache目錄下創(chuàng)建一個指定名字的緩存空間(文件夾)
- (id)initWithNamespace:(NSString *)ns;
 
2.在磁盤指定目錄(directory)下創(chuàng)建一個指定名字的緩存空間
- (id)initWithNamespace:(NSString *)ns diskCacheDirectory:(NSString *)directory;

3.添加一個只讀的緩存路徑
- (void)addReadOnlyCachePath:(NSString *)path;
3.緩存圖片到內(nèi)存和磁盤上
1.往內(nèi)存和磁盤上存儲一個圖片(key參數(shù)是唯一的潜必,用來取出圖片,一般是圖片的絕對路徑)
- (void)storeImage:(UIImage *)image forKey:(NSString *)key;

例子:
SDImageCache *imageCache = [SDImageCache sharedImageCache];
[imageCache storeImage:image forKey:@"myphoto" toDisk:YES];

2.緩存一個圖片到內(nèi)存沃但,并設(shè)置是否緩存到磁盤上
- (void)storeImage:(UIImage *)image forKey:(NSString *)key toDisk:(BOOL)toDisk;

3.緩存的基礎(chǔ)方法磁滚,緩存一個圖片到內(nèi)存,并設(shè)置是否緩存到磁盤上(recalculate 是否重新計算圖片的data , imageData 圖片的data)

  • (void)storeImage:(UIImage *)image recalculateFromImage:(BOOL)recalculate imageData:(NSData *)imageData forKey:(NSString *)key toDisk:(BOOL)toDisk;
    4垂攘、異步在磁盤上查找指定key圖片的緩存维雇,完成后回調(diào)block
  • (NSOperation *)queryDiskCacheForKey:(NSString *)key done:(SDWebImageQueryCompletedBlock)doneBlock;

5、從內(nèi)存晒他、磁盤獲取指定key的圖片

  • (UIImage *)imageFromMemoryCacheForKey:(NSString *)key;
  • (UIImage *)imageFromDiskCacheForKey:(NSString *)key;

6吱型、刪除指定key的圖片(fromDisk 是否刪除磁盤緩存,completion刪除結(jié)束后回調(diào)無參block)

  • (void)removeImageForKey:(NSString *)key;
  • (void)removeImageForKey:(NSString *)key withCompletion:(SDWebImageNoParamsBlock)completion;
  • (void)removeImageForKey:(NSString *)key fromDisk:(BOOL)fromDisk;
  • (void)removeImageForKey:(NSString *)key fromDisk:(BOOL)fromDisk withCompletion:(SDWebImageNoParamsBlock)completion;

7陨仅、清除所有緩存
1.清除所有內(nèi)存圖片緩存

  • (void)clearMemory;
    2.清除所有磁盤緩存圖片時回調(diào)一個block
  • (void)clearDiskOnCompletion:(SDWebImageNoParamsBlock)completion;
    3.清除所有磁盤緩存
  • (void)clearDisk;
    4.從磁盤刪除所有過期的圖片時立即調(diào)用
  • (void)cleanDiskWithCompletionBlock:(SDWebImageNoParamsBlock)completionBlock;
    5.刪除所有磁盤上過期的緩存圖片
  • (void)cleanDisk;

8唁影、獲取緩存大小、緩存?zhèn)€數(shù)
1.獲取磁盤緩存大小

  • (NSUInteger)getSize;
    2.獲取磁盤上緩存圖片的個數(shù)
  • (NSUInteger)getDiskCount;
    3.異步計算磁盤緩存的大小
  • (void)calculateSizeWithCompletionBlock:(SDWebImageCalculateSizeBlock)completionBlock;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末掂名,一起剝皮案震驚了整個濱河市据沈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌饺蔑,老刑警劉巖锌介,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異猾警,居然都是意外死亡孔祸,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門发皿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來崔慧,“玉大人,你說我怎么就攤上這事穴墅』淌遥” “怎么了?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵玄货,是天一觀的道長皇钞。 經(jīng)常有香客問我,道長松捉,這世上最難降的妖魔是什么夹界? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮隘世,結(jié)果婚禮上可柿,老公的妹妹穿的比我還像新娘。我一直安慰自己丙者,他們只是感情好复斥,可當(dāng)我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蔓钟,像睡著了一般永票。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天侣集,我揣著相機與錄音键俱,去河邊找鬼。 笑死世分,一個胖子當(dāng)著我的面吹牛编振,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播臭埋,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼踪央,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了瓢阴?” 一聲冷哼從身側(cè)響起畅蹂,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎荣恐,沒想到半個月后液斜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡叠穆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年少漆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片硼被。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡示损,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嚷硫,到底是詐尸還是另有隱情检访,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布论巍,位于F島的核電站烛谊,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏嘉汰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一状勤、第九天 我趴在偏房一處隱蔽的房頂上張望鞋怀。 院中可真熱鬧,春花似錦持搜、人聲如沸密似。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽残腌。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間抛猫,已是汗流浹背蟆盹。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留闺金,地道東北人逾滥。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像败匹,于是被迫代替她去往敵國和親寨昙。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內(nèi)容