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;