SDWebImage使用解析

SDWebImage是當(dāng)下最流行的一個三方圖片處理框架,我們使用較多的是它提供的UIImageView分類,支持從遠(yuǎn)程服務(wù)器下載并緩存圖片。

SDWebImage框架常用方法:

  • 根據(jù)圖片的url下載圖片并設(shè)置到ImageView上面去
/* *
 * 根據(jù)圖片的url下載圖片并設(shè)置到ImageView上面去(進行磁盤緩存和內(nèi)存緩存)
 * 異步下載并緩存
 *
 * @param url            圖片的URL
 * @param placeholder    顯示在UIImageView上面的占位圖片,直到圖片下載完成
 * @param options        下載圖片的選項。參考SDWebImageOptions的枚舉值
 * @param progressBlock  下載的進度回調(diào)
 * @param completedBlock 當(dāng)操作執(zhí)行完畢之后的回調(diào)。該回調(diào)沒有返回值
 *      第一個參數(shù)為請求的圖片
 *      第二個參數(shù)是NSError類型的,如果圖片下載成功則error為nil,否則error有值
 *      第三個參數(shù)是圖片緩存的使用情況(內(nèi)存緩存|沙盒緩存|直接下載)
 *      第四個參數(shù)是圖片的URL地址
 */
- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock;
    
   //SDWebImageOptions的枚舉值:一般使用的是SDWebImageRetryFailed | SDWebImageLowPriority
    typedef NS_OPTIONS(NSUInteger, SDWebImageOptions) {
       
        SDWebImageRetryFailed = 1 << 0,//下載失敗的時候會嘗試重新下載(默認(rèn))
        SDWebImageLowPriority = 1 << 1,//如果正在UI交互階段會暫停下載(延遲下載)
        SDWebImageCacheMemoryOnly = 1 << 2, //內(nèi)存中有緩存,沙河中沒有緩存
        SDWebImageProgressiveDownload = 1 << 3, //如果設(shè)置的話,圖片顯示像瀏覽器顯示圖片一樣(由上往下有進度的顯示)
        SDWebImageRefreshCached = 1 << 4, //將硬盤緩存交給系統(tǒng)自帶的NSURLCache去處理
        SDWebImageContinueInBackground = 1 << 5, //回到后臺的時候還會繼續(xù)下載
        SDWebImageHandleCookies = 1 << 6, // 通過設(shè)置NSMutableURLRequest.HTTPShouldHandleCookies = YES來處理存儲在NSHTTPCookieStore中的cookie
        SDWebImageAllowInvalidSSLCertificates = 1 << 7,// 允許不受信任的SSL證書。主要用于測試目的。
        SDWebImageHighPriority = 1 << 8,  //優(yōu)先下載
        SDWebImageDelayPlaceholder = 1 << 9, //延遲占位符
        SDWebImageTransformAnimatedImage = 1 << 10,
        SDWebImageAvoidAutoSetImage = 1 << 11  //改變動畫形象
    };
  • 下載圖片調(diào)用的主方法(進行磁盤緩存和內(nèi)存緩存)
/ **
 * @param url 圖片的URL地址
 * @param options 指定此次請求策略的選項
 * @param progressBlock 圖片下載進度的回調(diào)
 * @param completedBlock 操作完成后的回調(diào)
 *      此參數(shù)是必須的,此block沒有返回值
 *      Image:請求的 UIImage,如果出現(xiàn)錯誤,image參數(shù)是nil
 *      error:如果出現(xiàn)錯誤,則error有值
 *      cacheType:`SDImageCacheType` 枚舉,標(biāo)示該圖像的加載方式
 *          SDImageCacheTypeNone:從網(wǎng)絡(luò)下載
 *          SDImageCacheTypeDisk:從本地緩存加載
 *          SDImageCacheTypeMemory:從內(nèi)存緩存加載
 *          finished:如果圖像下載完成則為YES,如果使用 SDWebImageProgressiveDownload 選項,同時只獲取到部分圖片時,返回 NO
 *          imageURL:圖片的URL地址
 *
 * @return SDWebImageOperation對象,應(yīng)該是SDWebimageDownloaderOperation實例
 */
- (id <SDWebImageOperation>)downloadImageWithURL:(NSURL *)url
                                         options:(SDWebImageOptions)options
                                        progress:(SDWebImageDownloaderProgressBlock)progressBloc
                                       completed:(SDWebImageCompletionWithFinishedBlock)completedBlock;

  • 如果我們只需要下載圖片,而不需要進行cache處理的時候,我們常常用另外一個類來達(dá)成效果:
- (id <SDWebImageOperation>)downloadImageWithURL:(NSURL *)url options:(SDWebImageDownloaderOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageDownloaderCompletedBlock)completedBlock;
  • 播放Gif圖片
//傳入Gif圖像的名稱,得到一個可動畫的圖像
+ (UIImage *)sd_animatedGIFNamed:(NSString *)name;

//傳入Gif圖像的二進制數(shù)據(jù),得到一個可動畫的圖像
+ (UIImage *)sd_animatedGIFWithData:(NSData *)data;
  • 內(nèi)存警告處理

-(void)applicationDidReceiveMemoryWarning:(UIApplication *)application
{
    //1.清空緩存
    //clearDisk:直接刪除緩存目錄下面的文件,然后重新創(chuàng)建空的緩存文件
    //cleanDisk:刪除過期的文件數(shù)據(jù),計算當(dāng)前未過期的已經(jīng)下載的文件數(shù)據(jù)的大小,如果發(fā)現(xiàn)該數(shù)據(jù)大小大于我們設(shè)置的最大緩存數(shù)據(jù)大小,那么程序內(nèi)部會按照按文件數(shù)據(jù)緩存的時間從遠(yuǎn)到近刪除,直到小于最大緩存數(shù)據(jù)為止。
    //過期時間:7天
    [[SDWebImageManager sharedManager].imageCache clearDisk];
    
    //2.取消當(dāng)前所有的操作
    [[SDWebImageManager sharedManager] cancelAll];
}

SDWebImage 加載圖片的原理

  1. 顯示placeholderImage
  2. SDImageCache從緩存中查找圖片是否已經(jīng)下載
  3. 先從內(nèi)存圖片緩存查找是否有圖片
  4. 如果內(nèi)存中有圖片緩存,顯示圖片
  5. 如果內(nèi)存中沒有,生成NSInvocationOperation添加到執(zhí)行隊列開始從硬盤查找圖片緩存
  6. 如果硬盤中有,將圖片添加到內(nèi)存緩存中(如果空閑內(nèi)存過小,會先清空內(nèi)存緩存),顯示圖片
  7. 如果硬盤中沒有,說明該圖片沒有緩存,需要下載圖片,共享或重新生成一個下載器SDWebImageDownLoader開始下載圖片
  8. 開始圖片網(wǎng)絡(luò)請求,下載數(shù)據(jù)
  9. 數(shù)據(jù)下載完成后交給SDWebImageDecoder做圖片解碼
  10. 回調(diào)展示圖片
  11. 圖片保存到硬盤緩存和內(nèi)存緩存
  12. SDImageCache初始化會注冊一些通知,在內(nèi)存警告或退到后臺的時候清理內(nèi)存圖片緩存,應(yīng)用結(jié)束的時候清理過期圖片(圖片緩存周期是一周)

SDWebImage框架細(xì)節(jié)

  • SDWebImage內(nèi)部結(jié)構(gòu)


    Snip20170522_14.png
  • SDWebImage相關(guān)知識點補充

  • SDWebImage接收到內(nèi)存警告的時候如何處理?采用監(jiān)聽系統(tǒng)警告通知的方式處理,接收到警告后清空緩存

  • SDWebImage隊列最大并發(fā)數(shù)為6

  • SDWebImage內(nèi)部設(shè)置下載圖片超時時間為15m

  • SDWebImage圖片下載操作使用了NSURLConnection類發(fā)送網(wǎng)絡(luò)請求實現(xiàn)

  • 圖片的下載順序,默認(rèn)是先進先出的

  • SDWebImage內(nèi)部如何判斷圖片類型?判斷該圖片二進制數(shù)據(jù)的第一個字節(jié)

  + (NSString *)sd_contentTypeForImageData:(NSData *)data;
  • SDWebImage做沙盒緩存時圖片的命名機制是拿到圖片的URL后直接對URL進行MD5加密。終端輸入:echo -n "url" |MD5

    Snip20160221_38.png
  • SDWebImage內(nèi)部使用NSCache類來進行緩存處理

  • NSCache是蘋果官方提供的緩存類,專門用來進行緩存處理,具體使用和NSDictionary類似,在AFN和SDWebImage框架中被使用來管理緩存

  • 蘋果官方解釋NSCache在系統(tǒng)內(nèi)存很低時,會自動釋放對象(但模擬器演示不會釋放)建議:接收到內(nèi)存警告時主動調(diào)用removeAllObject方法釋放對象

  • NSCache是線程安全的,在多線程操作中,不需要對NSCache加鎖

  • NSCache的Key只是對對象進行Strong引用,不是拷貝

  • 屬性介紹

@property (nullable, assign) id<NSCacheDelegate> delegate; //設(shè)置代理
@property (copy) NSString *name; //名稱
@property NSUInteger totalCostLimit; //緩存空間的最大總成本,超出上限會自動回收對象。默認(rèn)值為0,表示沒有限制
@property NSUInteger countLimit;//能夠緩存的對象的最大數(shù)量。默認(rèn)值為0,表示沒有限制
@property BOOL evictsObjectsWithDiscardedContent;//標(biāo)識緩存是否回收廢棄的內(nèi)容
  • 方法介紹
       - (void)setObject:(ObjectType)obj forKey:(KeyType)key;//在緩存中設(shè)置指定鍵名對應(yīng)的值,0成本
       - (void)setObject:(ObjectType)obj forKey:(KeyType)key cost:(NSUInteger)g;//在緩存中設(shè)置指定鍵名對應(yīng)的值,并且指定該鍵值對的成本,用于計算記錄在緩存中的所有對象的總成本,出現(xiàn)內(nèi)存警告或者超出緩存總成本上限的時候,緩存會開啟一個回收過程,刪除部分元素
       - (void)removeObjectForKey:(KeyType)key;//刪除緩存中指定鍵名的對象
       - (void)removeAllObjects;//刪除緩存中所有的對象
       - (void)cache:(NSCache *)cache willEvictObject:(id)obj;//代理方法,即將回收對象的時候調(diào)用該方法
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容