這個(gè)類庫(kù)提供一個(gè)UIImageView類別以支持加載來(lái)自網(wǎng)絡(luò)的遠(yuǎn)程圖片。具有緩存管理、異步下載、同一個(gè)URL下載次數(shù)控制和優(yōu)化等特征。
使用示范的代碼:
UITableView使用UIImageView+WebCache類(基本應(yīng)用罢浇,UIImageView的一個(gè)category)
前提#import導(dǎo)入U(xiǎn)IImageView+WebCache.h文件,然后在tableview的cellForRowAtIndexPath:方法下:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)
indexPath {
static NSString *MyIdentifier = @"MyIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier] autorelease];
}
[cell.imageView setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"]
placeholderImage:[UIImage imageNamed:@"placeholder.png"];
cell.textLabel.text = @"My Text";
return cell;
}
基本代碼:
[imageView setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/image.jpg"];
使用SDWebImageManager類:可以進(jìn)行一些異步加載的工作沐祷。
SDWebImageManager *manager = [SDWebImageManager sharedManager];
將需要緩存的圖片加載進(jìn)來(lái)
UIImage *cachedImage = [manager imageWithURL:url];
if (cachedImage) {
// 如果Cache命中嚷闭,則直接利用緩存的圖片進(jìn)行有關(guān)操作
// Use the cached image immediatly
} else {
// 如果Cache沒(méi)有命中,則去下載指定網(wǎng)絡(luò)位置的圖片戈轿,并且給出一個(gè)委托方法
// Start an async download
[manager downloadWithURL:url delegate:self];
}
當(dāng)然你的類要實(shí)現(xiàn)SDWebImageManagerDelegate協(xié)議凌受,并且要實(shí)現(xiàn)協(xié)議的webImageManager:didFinishWithImage:方法。
當(dāng)下載完成后思杯,調(diào)用回調(diào)方法胜蛉,使下載的圖片顯示
- (void)webImageManager:(SDWebImageManager *)imageManager didFinishWithImage:(UIImage *)image {
// Do something with the downloaded image
}
獨(dú)立的異步圖像下載可能會(huì)單獨(dú)用到異步圖片下載,則一定要用downloaderWithURL:delegate:來(lái)建立一個(gè)SDWebImageDownloader實(shí)例色乾。
downloader = [SDWebImageDownloader downloaderWithURL:url delegate:self];
這樣 SDWebImageDownloaderDelegate協(xié)議的方法imageDownloader:didFinishWithImage:被調(diào)用時(shí)下載會(huì)立即開始并完成誊册。
獨(dú)立的異步圖像緩存
SDImageCache類提供一個(gè)創(chuàng)建空緩存的實(shí)例,并用方法imageForKey:來(lái)尋找當(dāng)前緩存暖璧。
UIImage *myCachedImage = [SDImageCache sharedImageCache] imageFromKey:myCacheKey];
存儲(chǔ)一個(gè)圖像到緩存是使用方法storeImage: forKey:
[SDImageCache sharedImageCache] storeImage:myImage forKey:myCacheKey];
默認(rèn)情況下案怯,圖像將被存儲(chǔ)在內(nèi)存緩存和磁盤緩存中。如果僅僅是想內(nèi)存緩存中澎办,要使用storeImage:forKey:toDisk:方法的第三個(gè)參數(shù)帶一負(fù)值來(lái)替代嘲碱。
SDWebImage 支持異步的圖片下載+緩存,提供了 UIImageView+WebCacha 的 category局蚀,方便使用麦锯。紀(jì)錄一下 SDWebImage 加載圖片的流程。
入口 setImageWithURL:placeholderImage:options: 會(huì)先把 placeholderImage 顯示琅绅,然后 SDWebImageManager 根據(jù) URL 開始處理圖片扶欣。
進(jìn)入 SDWebImageManager-downloadWithURL:delegate:options:userInfo:,交給 SDImageCache 從緩存查找圖片是否已經(jīng)下載 queryDiskCacheForKey:delegate:userInfo:.
先從內(nèi)存圖片緩存查找是否有圖片千扶,如果內(nèi)存中已經(jīng)有圖片緩存料祠,SDImageCacheDelegate 回調(diào) imageCache:didFindImage:forKey:userInfo: 到 SDWebImageManager。
SDWebImageManagerDelegate 回調(diào) webImageManager:didFinishWithImage: 到 UIImageView+WebCache 等前端展示圖片澎羞。如果內(nèi)存緩存中沒(méi)有髓绽,生成 NSInvocationOperation 添加到隊(duì)列開始從硬盤查找圖片是否已經(jīng)緩存。
根據(jù) URLKey 在硬盤緩存目錄下嘗試讀取圖片文件妆绞。這一步是在 NSOperation 進(jìn)行的操作顺呕,所以回主線程進(jìn)行結(jié)果回調(diào) notifyDelegate:接谨。
如果上一操作從硬盤讀取到了圖片,將圖片添加到內(nèi)存緩存中(如果空閑內(nèi)存過(guò)小塘匣,會(huì)先清空內(nèi)存緩存)。SDImageCacheDelegate 回調(diào) imageCache:didFindImage:forKey:userInfo:巷帝。進(jìn)而回調(diào)展示圖片忌卤。
如果從硬盤緩存目錄讀取不到圖片,說(shuō)明所有緩存都不存在該圖片楞泼,需要下載圖片驰徊,回調(diào) imageCache:didNotFindImageForKey:userInfo:。
共享或重新生成一個(gè)下載器 SDWebImageDownloader 開始下載圖片堕阔。
圖片下載由 NSURLConnection 來(lái)做棍厂,實(shí)現(xiàn)相關(guān) delegate 來(lái)判斷圖片下載中、下載完成和下載失敗超陆。
connection:didReceiveData: 中利用 ImageIO 做了按圖片下載進(jìn)度加載效果牺弹。
connectionDidFinishLoading: 數(shù)據(jù)下載完成后交給 SDWebImageDecoder 做圖片解碼處理。
圖片解碼處理在一個(gè) NSOperationQueue 完成时呀,不會(huì)拖慢主線程 UI张漂。如果有需要對(duì)下載的圖片進(jìn)行二次處理,最好也在這里完成谨娜,效率會(huì)好很多航攒。
在主線程 notifyDelegateOnMainThreadWithInfo: 宣告解碼完成,
imageDecoder:didFinishDecodingImage:userInfo: 回調(diào)給 SDWebImageDownloader趴梢。
imageDownloader:didFinishWithImage: 回調(diào)給 SDWebImageManager 告知圖片下載完成漠畜。
通知所有的 downloadDelegates 下載完成,回調(diào)給需要的地方展示圖片坞靶。
將圖片保存到 SDImageCache 中憔狞,內(nèi)存緩存和硬盤緩存同時(shí)保存。寫文件到硬盤也在以單獨(dú) NSInvocationOperation 完成滩愁,避免拖慢主線程躯喇。
SDImageCache 在初始化的時(shí)候會(huì)注冊(cè)一些消息通知,在內(nèi)存警告或退到后臺(tái)的時(shí)候清理內(nèi)存圖片緩存硝枉,應(yīng)用結(jié)束的時(shí)候清理過(guò)期圖片廉丽。
SDWI 也提供了 UIButton+WebCache 和 MKAnnotationView+WebCache,方便使用妻味。
SDWebImagePrefetcher 可以預(yù)先下載圖片正压,方便后續(xù)使用。
SDWebImage庫(kù)的作用:
通過(guò)對(duì)UIImageView的類別擴(kuò)展來(lái)實(shí)現(xiàn)異步加載替換圖片的工作责球。