iOS 圖片加載框架SDWebImage詳解

目的

在使用SDWebImage加載圖片時掉盅,尤其是加載gif等大圖時云头,SDWebImage會將圖片緩存在內(nèi)存中酒请,這樣是非常吃內(nèi)存的,這時我們就需要在適當(dāng)?shù)臅r候去釋放一下SDWebImage的內(nèi)存緩存蔓纠,才不至于造成APP閃退辑畦。
SDWebImage 提供了 UIImageView、UIButton 腿倚、MKAnnotationView 的圖片下載分類纯出,只要一行代碼就可以實(shí)現(xiàn)圖片異步下載和緩存功能。
這樣開發(fā)者就無須花太多精力在圖片下載細(xì)節(jié)上,專心處理業(yè)務(wù)邏輯暂筝。

SDWebImage 特點(diǎn)

  1. 提供 UIImageView, UIButton, MKAnnotationView 的分類箩言,用來顯示網(wǎng)絡(luò)圖片,以及緩存管理
  2. 異步下載圖片
  3. 異步緩存(內(nèi)存+磁盤)焕襟,并且自動管理緩存有效性
  4. 后臺圖片解壓縮
  5. 同一個 URL 不會重復(fù)下載
  6. 自動識別無效 URL陨收,不會反復(fù)重試
  7. 不阻塞主線程
  8. 高性能
  9. 使用 GCD 和 ARC
  10. 支持多種圖片格式(包括 WebP 格式)
  11. 支持動圖(GIF)
  12. 4.0 之前的動圖效果并不是太好
  13. 4.0 以后基于 FLAnimatedImage加載動圖

注:本文選讀的代碼是 3.7.3 版本的,所以動圖加載還不支持 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)务漩,如果你在圖片加載完成前取消了請求操作,就不會收到成功或失敗的回調(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)容不會緩存居触。

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)建一個有獨(dú)立命名空間的 SDImageCache 實(shí)例源葫。

添加緩存的方法:

[[SDImageCache sharedImageCache] storeImage:myImage forKey:myCacheKey];

默認(rèn)情況下诗越,圖片數(shù)據(jù)會同時緩存到內(nèi)存和磁盤中,如果你想只要內(nèi)存緩存的話息堂,可以使用下面的方法:

[[SDImageCache sharedImageCache] storeImage:myImage forKey:myCacheKey toDisk:NO];

讀取緩存時可以使用 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

有時候床未,一張圖片的 URL 中的一部分可能是動態(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ò)圖片時會出現(xiàn)尺寸縮放問題薇搁。

解決方案:
自定義 UITableViewCell,重寫 -layoutSubviews 方法渡八,調(diào)整位置尺寸啃洋;
或者直接棄用 UITableViewCell 的 imageView,自己添加一個 imageView 作為子控件屎鳍。

  • 問題 2:圖片刷新問題:SDWebImage 在進(jìn)行緩存時忽略了所有服務(wù)器返回的 caching control 設(shè)置宏娄,并且在緩存時沒有做時間限制,這也就意味著圖片 URL 必須是靜態(tài)的了逮壁,要求服務(wù)器上一個 URL 對應(yīng)的圖片內(nèi)容不允許更新孵坚。但是如果存儲圖片的服務(wù)器不由自己控制,也就是說 圖片內(nèi)容更新了,URL 卻沒有更新卖宠,這種情況怎么辦巍杈?

解決方案:在調(diào)用 sd_setImageWithURL: placeholderImage: options:方法時設(shè)置 options 參數(shù)為 SDWebImageRefreshCached,這樣雖然會降低性能逗堵,但是下載圖片時會照顧到服務(wù)器返回的 caching control秉氧。

  • 問題 3:在加載圖片時,如何添加默認(rèn)的 progress indicator 蜒秤?
    解決方案:在調(diào)用 -sd_setImageWithURL:方法之前汁咏,先調(diào)用下面的方法:
  [imageView sd_setShowActivityIndicatorView:YES];
  [imageView sd_setIndicatorStyle:UIActivityIndicatorViewStyleGray];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市作媚,隨后出現(xiàn)的幾起案子攘滩,更是在濱河造成了極大的恐慌,老刑警劉巖纸泡,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件漂问,死亡現(xiàn)場離奇詭異,居然都是意外死亡女揭,警方通過查閱死者的電腦和手機(jī)蚤假,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吧兔,“玉大人磷仰,你說我怎么就攤上這事【嘲” “怎么了灶平?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長箍土。 經(jīng)常有香客問我逢享,道長,這世上最難降的妖魔是什么吴藻? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任瞒爬,我火速辦了婚禮,結(jié)果婚禮上沟堡,老公的妹妹穿的比我還像新娘疮鲫。我一直安慰自己,他們只是感情好弦叶,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布俊犯。 她就那樣靜靜地躺著,像睡著了一般伤哺。 火紅的嫁衣襯著肌膚如雪燕侠。 梳的紋絲不亂的頭發(fā)上者祖,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天,我揣著相機(jī)與錄音绢彤,去河邊找鬼七问。 笑死,一個胖子當(dāng)著我的面吹牛茫舶,可吹牛的內(nèi)容都是我干的械巡。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼饶氏,長吁一口氣:“原來是場噩夢啊……” “哼讥耗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起疹启,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤古程,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后喊崖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挣磨,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年荤懂,在試婚紗的時候發(fā)現(xiàn)自己被綠了茁裙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡节仿,死狀恐怖晤锥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情粟耻,我是刑警寧澤查近,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布眉踱,位于F島的核電站挤忙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏谈喳。R本人自食惡果不足惜册烈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望婿禽。 院中可真熱鬧赏僧,春花似錦、人聲如沸扭倾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽膛壹。三九已至驾中,卻和暖如春唉堪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背肩民。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工唠亚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人持痰。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓灶搜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親工窍。 傳聞我的和親對象是個殘疾皇子割卖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評論 2 354

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