目的緩存
在使用SDWebImage加載圖片時,尤爲是加載gif等大圖時,SDWebImage會將圖片緩存在內存中,這樣是很是吃內存的,這時咱們就須要在適當的時候去釋放一下SDWebImage的內存緩存,纔不至於形成APP閃退。 SDWebImage 提供了 UIImageView、UIButton 、MKAnnotationView 的圖片下載分類,只要一行代碼就能夠實現圖片異步下載和緩存功能。 這樣開發者就無須花太多精力在圖片下載細節上,專心處理業務邏輯。服務器
SDWebImage 特色網絡
提供 UIImageView, UIButton, MKAnnotationView 的分類,用來顯示網絡圖片,以及緩存管理 異步下載圖片 異步緩存(內存+磁盤),而且自動管理緩存有效性 後臺圖片解壓縮 同一個 URL 不會重複下載 自動識別無效 URL,不會反覆重試 不阻塞主線程 高性能 使用 GCD 和 ARC 支持多種圖片格式(包括 WebP 格式) 支持動圖(GIF) 4.0 以前的動圖效果並非太好 4.0 之後基於 FLAnimatedImage加載動圖 注:本文選讀的代碼是 3.7.3 版本的,因此動圖加載還不支持 FLAnimatedImage。 SDWebImage 使用dom
[cell.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"] placeholderImage:[UIImage imageNamed:@"placeholder.png"]]; 2. 使用回調 blocks異步
在 block 中獲得圖片下載進度和圖片加載完成(下載完成或者讀取緩存)的回調,若是你在圖片加載完成前取消了請求操做,就不會收到成功或失敗的回調性能
[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 的使用url
UIImageView(WebCache) 分類的核心在於 SDWebImageManager 的下載和緩存處理,SDWebImageManager將圖片下載和圖片緩存組合起來了。SDWebImageManager也能夠單獨使用。spa
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. 單獨使用 SDWebImageDownloader 異步下載圖片線程
咱們還能夠單獨使用 SDWebImageDownloader 來下載圖片,可是圖片內容不會緩存。code
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. 單獨使用 SDImageCache 異步緩存圖片
SDImageCache 支持內存緩存和異步的磁盤緩存(可選),若是你想單獨使用 SDImageCache 來緩存數據的話,可使用單例,也能夠建立一個有獨立命名空間的 SDImageCache 實例。
添加緩存的方法:
[[SDImageCache sharedImageCache] storeImage:myImage forKey:myCacheKey]; 默認狀況下,圖片數據會同時緩存到內存和磁盤中,若是你想只要內存緩存的話,可使用下面的方法:
[[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 中的一部分多是動態變化的(好比獲取權限上的限制),因此咱們只須要把 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 加載不一樣尺寸的網絡圖片時會出現尺寸縮放問題。 解決方案: 自定義 UITableViewCell,重寫 -layoutSubviews 方法,調整位置尺寸; 或者直接棄用 UITableViewCell 的 imageView,本身添加一個 imageView 做爲子控件。 問題 2:圖片刷新問題:SDWebImage 在進行緩存時忽略了全部服務器返回的 caching control 設置,而且在緩存時沒有作時間限制,這也就意味着圖片 URL 必須是靜態的了,要求服務器上一個 URL 對應的圖片內容不容許更新。可是若是存儲圖片的服務器不禁本身控制,也就是說 圖片內容更新了,URL 卻沒有更新,這種狀況怎麼辦? 解決方案:在調用 sd_setImageWithURL: placeholderImage: options:方法時設置 options 參數爲 SDWebImageRefreshCached,這樣雖然會下降性能,可是下載圖片時會照顧到服務器返回的 caching control。 問題 3:在加載圖片時,如何添加默認的 progress indicator ? 解決方案:在調用 -sd_setImageWithURL:方法以前,先調用下面的方法: [imageView sd_setShowActivityIndicatorView:YES]; [imageView sd_setIndicatorStyle:UIActivityIndicatorViewStyleGray];