iOS 圖片加載框架SDWebImage解讀
目的
在使用SDWebImage加載圖片時(shí),尤其是加載gif等大圖時(shí),SDWebImage會(huì)將圖片緩存在內(nèi)存中,這樣是非常吃內(nèi)存的,這時(shí)我們就需要在適當(dāng)?shù)臅r(shí)候去釋放一下SDWebImage的內(nèi)存緩存,才不至于造成APP閃退。
SDWebImage 提供了 UIImageView、UIButton 、MKAnnotationView 的圖片下載分類,只要一行代碼就可以實(shí)現(xiàn)圖片異步下載和緩存功能。
這樣開發(fā)者就無須花太多精力在圖片下載細(xì)節(jié)上,專心處理業(yè)務(wù)邏輯。
SDWebImage 特點(diǎn)
- 提供 UIImageView, UIButton, MKAnnotationView 的分類,用來顯示網(wǎng)絡(luò)圖片,以及緩存管理
- 異步下載圖片
- 異步緩存(內(nèi)存+磁盤),并且自動(dòng)管理緩存有效性
- 后臺(tái)圖片解壓縮
- 同一個(gè) URL 不會(huì)重復(fù)下載
- 自動(dòng)識(shí)別無效 URL,不會(huì)反復(fù)重試
- 不阻塞主線程
- 高性能
- 使用 GCD 和 ARC
- 支持多種圖片格式(包括 WebP 格式)
- 支持動(dòng)圖(GIF)
- 4.0 之前的動(dòng)圖效果并不是太好
- 4.0 以后基于 FLAnimatedImage加載動(dòng)圖
注:本文選讀的代碼是 3.7.3 版本的,所以動(dòng)圖加載還不支持 FLAnimatedImage。
SDWebImage 使用
1. UITableView 中使用 UIImageView+WebCache
[cell.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"] placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
2. 使用回調(diào) blocks
在 block 中得到圖片下載進(jìn)度和圖片加載完成(下載完成或者讀取緩存)的回調(diào),如果你在圖片加載完成前取消了請(qǐng)求操作,就不會(huì)收到成功或失敗的回調(diào)
[cell.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"] placeholderImage:[UIImage imageNamed:@"placeholder.png"] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { ... completion code here ... }];
3. SDWebImageManager 的使用
UIImageView(WebCache) 分類的核心在于 SDWebImageManager 的下載和緩存處理,SDWebImageManager將圖片下載和圖片緩存組合起來了。SDWebImageManager也可以單獨(dú)使用。
SDWebImageManager *manager = [SDWebImageManager sharedManager]; [manager loadImageWithURL:imageURL options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) { // progression tracking code } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { if (image) { // do something with image } }];
4. 單獨(dú)使用 SDWebImageDownloader 異步下載圖片
我們還可以單獨(dú)使用 SDWebImageDownloader 來下載圖片,但是圖片內(nèi)容不會(huì)緩存。
SDWebImageDownloader *downloader = [SDWebImageDownloader sharedDownloader]; [downloader downloadImageWithURL:imageURL options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) { // progression tracking code } completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) { if (image && finished) { // do something with image } }];
5. 單獨(dú)使用 SDImageCache 異步緩存圖片
SDImageCache 支持內(nèi)存緩存和異步的磁盤緩存(可選),如果你想單獨(dú)使用 SDImageCache 來緩存數(shù)據(jù)的話,可以使用單例,也可以創(chuàng)建一個(gè)有獨(dú)立命名空間的 SDImageCache 實(shí)例。
添加緩存的方法:
[[SDImageCache sharedImageCache] storeImage:myImage forKey:myCacheKey];
默認(rèn)情況下,圖片數(shù)據(jù)會(huì)同時(shí)緩存到內(nèi)存和磁盤中,如果你想只要內(nèi)存緩存的話,可以使用下面的方法:
[[SDImageCache sharedImageCache] storeImage:myImage forKey:myCacheKey toDisk:NO];
讀取緩存時(shí)可以使用 queryDiskCacheForKey:done: 方法,圖片緩存的 key 是唯一的,通常就是圖片的 absolute URL。
SDImageCache *imageCache = [[SDImageCache alloc] initWithNamespace:@"myNamespace"]; [imageCache queryDiskCacheForKey:myCacheKey done:^(UIImage *image) { // image is not nil if image was found }];
6. 自定義緩存 key
有時(shí)候,一張圖片的 URL 中的一部分可能是動(dòng)態(tài)變化的(比如獲取權(quán)限上的限制),所以我們只需要把 URL 中不變的部分作為緩存用的 key。
SDWebImageManager.sharedManager.cacheKeyFilter = ^(NSURL *url) { url = [[NSURL alloc] initWithScheme:url.scheme host:url.host path:url.path]; return [url absoluteString]; };
常見問題
問題 1:使用 UITableViewCell 中的 imageView 加載不同尺寸的網(wǎng)絡(luò)圖片時(shí)會(huì)出現(xiàn)尺寸縮放問題。
解決方案:
自定義 UITableViewCell,重寫 -layoutSubviews 方法,調(diào)整位置尺寸;
或者直接棄用 UITableViewCell 的 imageView,自己添加一個(gè) imageView 作為子控件。
問題 2:圖片刷新問題:SDWebImage 在進(jìn)行緩存時(shí)忽略了所有服務(wù)器返回的 caching control 設(shè)置,并且在緩存時(shí)沒有做時(shí)間限制,這也就意味著圖片 URL 必須是靜態(tài)的了,要求服務(wù)器上一個(gè) URL 對(duì)應(yīng)的圖片內(nèi)容不允許更新。但是如果存儲(chǔ)圖片的服務(wù)器不由自己控制,也就是說 圖片內(nèi)容更新了,URL 卻沒有更新,這種情況怎么辦?
解決方案:在調(diào)用 sd_setImageWithURL: placeholderImage: options:方法時(shí)設(shè)置 options 參數(shù)為 SDWebImageRefreshCached,這樣雖然會(huì)降低性能,但是下載圖片時(shí)會(huì)照顧到服務(wù)器返回的 caching control。
問題 3:在加載圖片時(shí),如何添加默認(rèn)的 progress indicator ?
解決方案:在調(diào)用 -sd_setImageWithURL:方法之前,先調(diào)用下面的方法:
[imageView sd_setShowActivityIndicatorView:YES]; [imageView sd_setIndicatorStyle:UIActivityIndicatorViewStyleGray]; ```
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
iOS自定義collectionView實(shí)現(xiàn)毛玻璃效果
不知道大家發(fā)現(xiàn)沒有蘋果在iOS7.0之后,很多系統(tǒng)界面都使用了毛玻璃效果,增加了界面的美觀性,所以這篇文章跟大家分享個(gè)iOS自定義collectionView實(shí)現(xiàn)毛玻璃效果的方法,有需要的可以參考借鑒,下面來一起看看。2016-09-09iOS手勢(shì)識(shí)別的詳細(xì)使用方法(拖動(dòng),縮放,旋轉(zhuǎn),點(diǎn)擊,手勢(shì)依賴,自定義手勢(shì))
這篇文章主要介紹了iOS手勢(shì)識(shí)別的詳細(xì)使用方法(拖動(dòng),縮放,旋轉(zhuǎn),點(diǎn)擊,手勢(shì)依賴,自定義手勢(shì)),具有一定的參考價(jià)值,有需要的可以參考一下。2016-11-11iOS APP實(shí)現(xiàn)微信H5支付示例總結(jié)
這篇文章主要介紹了iOS APP實(shí)現(xiàn)微信H5支付示例總結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02iOS開發(fā)輸入自動(dòng)填充UITextField背景色
如何在iOS中實(shí)現(xiàn)輸入時(shí)自動(dòng)填充背景色的效果,首先,我們?cè)O(shè)置UITextField的背景色為初始顏色,然后,通過設(shè)置UITextField的代理,并監(jiān)聽UITextField的輸入事件,我們?cè)谟脩糸_始輸入時(shí)將其背景色改變?yōu)楦吡令伾?在用戶結(jié)束輸入時(shí)恢復(fù)為初始顏色2023-10-10iOS Webview自適應(yīng)實(shí)際內(nèi)容高度的4種方法詳解
這篇文章主要介紹了iOS Webview自適應(yīng)實(shí)際內(nèi)容高度的4種方法詳解,本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09詳解ios監(jiān)聽reloadData刷新列表完畢的時(shí)機(jī)
這篇文章主要介紹了詳解ios監(jiān)聽reloadData刷新列表完畢的時(shí)機(jī),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-11-11iOS基礎(chǔ)知識(shí)之@property 和 Ivar 的區(qū)別
這篇文章主要介紹了iOS基礎(chǔ)知識(shí)之@property 和 Ivar 的區(qū)別介紹,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-08-08IOS開發(fā)仿微信右側(cè)彈出視圖實(shí)現(xiàn)
這篇文章主要介紹了IOS開發(fā)仿微信右側(cè)彈出視圖實(shí)現(xiàn)的相關(guān)資料,希望通過本文能幫助到大家,讓大家實(shí)現(xiàn)這樣類似的功能,需要的朋友可以參考下2017-10-10iOS中獲取系統(tǒng)相冊(cè)中的圖片實(shí)例
這篇文章主要介紹了iOS中獲取系統(tǒng)相冊(cè)中的圖片實(shí)例,具有一定的參考價(jià)值沒有需要的朋友可以了解一下。2016-11-11