SDWebImage常用方法及原理


1 SDWebImage的最大并發(fā)數(shù)是多少撩嚼?

_downloadQueue.maxConcurrentOperationCount = 6;

2 SDWebImages是如何識別圖片的梦重?

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

判斷圖片的十六進制第一個字節(jié).png

3 SDWebImage緩存圖片命名規(guī)則霍衫?為了防止名稱重復(fù),對其進行md5運算

$$默認(rèn)下載的超時時長是多少叠纹?15秒

4默認(rèn)緩存的時間玉控?一周

_maxCacheAge = kDefaultCacheMaxCacheAge;

static const NSInteger kDefaultCacheMaxCacheAge = 606024 * 7;// 1 week

5 SDWebImage用什么類型緩存圖片?

NSCacheSDImageCache內(nèi)處理內(nèi)存警告座每,以通知的方式前鹅,clearMemory

6 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;

5.-(void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletionBlock)completedBlock;

6.-(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:^(NSIntegerreceivedSize,NSIntegerexpectedSize {

//乘1.0是為了轉(zhuǎn)換成float類型floatprogress = 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失敗后重試,默認(rèn)如果下載失敗,這個url會被加入黑名單并且不會嘗試再次下載,設(shè)置這個枚舉會阻止把失敗的url加入黑名單斤彼,不斷嘗試重新下載

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

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

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

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

原因:

默認(rèn)情況下,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è)置圖片却音,默認(rèn)是下載完成后自動放到ImageView上

SDWebImageCompletionBlock

typedef void(^SDWebImageCompletionBlock)(UIImageimage,NSErrorerror,SDImageCacheType cacheType,NSURLimageURL);

參數(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 = receivedSize1.0 / expectedSize;

四阿纤、本地緩存

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

屬性:

1.是否壓縮圖片

@property(assign,nonatomic)BOOLshouldDecompressImages;

2.是否禁用iCloud,默認(rèn)YES

@property(assign,nonatomic)BOOL shouldDisableiCloud;

3.是否緩存到內(nèi)存肌稻,默認(rèn)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.最大緩存時間爹谭,單位:秒,針對磁盤緩存榛搔,默認(rèn)是一周践惑,自動把一星期以前緩存的圖片刪除掉

@property(assign,nonatomic)NSInteger maxCacheAge;

7.最大緩存大小尔觉,單位字節(jié),針對磁盤专甩,默認(rèn)無限制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閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件菊卷,死亡現(xiàn)場離奇詭異宝剖,居然都是意外死亡,警方通過查閱死者的電腦和手機扑眉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門襟雷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人咧虎,你說我怎么就攤上這事≌骰#” “怎么了总寒?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵摄闸,是天一觀的道長妹萨。 經(jīng)常有香客問我乎完,道長,這世上最難降的妖魔是什么桥状? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任岛宦,我火速辦了婚禮砾肺,結(jié)果婚禮上防嗡,老公的妹妹穿的比我還像新娘。我一直安慰自己裙盾,他們只是感情好番官,可當(dāng)我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布钢属。 她就那樣靜靜地躺著淆党,像睡著了一般。 火紅的嫁衣襯著肌膚如雪山孔。 梳的紋絲不亂的頭發(fā)上台颠,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天串前,我揣著相機與錄音锅铅,去河邊找鬼盐须。 笑死,一個胖子當(dāng)著我的面吹牛阶冈,可吹牛的內(nèi)容都是我干的女坑。 我是一名探鬼主播匆骗,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼碉就,長吁一口氣:“原來是場噩夢啊……” “哼瓮钥!你這毒婦竟也來了碉熄?” 一聲冷哼從身側(cè)響起锈津,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤一姿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛉顽,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡携冤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年闲勺,在試婚紗的時候發(fā)現(xiàn)自己被綠了菜循。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翘地。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出衙耕,到底是詐尸還是另有隱情昧穿,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布橙喘,位于F島的核電站时鸵,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏厅瞎。R本人自食惡果不足惜饰潜,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望和簸。 院中可真熱鬧囊拜,春花似錦、人聲如沸比搭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嗓化。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間酝枢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓陨帆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,976評論 2 355

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