SDWebImage原始碼剖析(二)

發表於2016-07-28

SDWebImageCache管理著SDWebImage的快取,其中記憶體快取採用NSCache,同時會建立一個ioQueue負責對硬碟的讀寫,並且會新增觀察者,在收到記憶體警告、關閉或進入後臺時完成對應的處理:

查詢圖片

每次向SDWebImageCache索取圖片的時候,會先根據圖片URL對應的key值先檢查記憶體中是否有對應的圖片,如果有則直接返回;如果沒有則在ioQueue中去硬碟中查詢,其中檔名是是根據URL生成的MD5值,找到之後先將圖片快取在記憶體中,然後在把圖片返回:

在硬碟查詢的時候,會在後臺將NSData轉成UIImage,並完成相關的解碼工作:

儲存圖片

當下載完圖片後,會先將圖片儲存到NSCache中,並把圖片畫素大小作為該物件的cost值,同時如果需要儲存到硬碟,會先判斷圖片的格式,PNG或者JPEG,並儲存對應的NSData到快取路徑中,檔名為URL的MD5值:

硬碟檔案的管理

在程式退出或者進入後臺時,會出圖片檔案進行管理,具體的策略:

  • 清除過期的檔案,預設一星期
  • 如果設定了最大快取,並且當前快取的檔案超過了這個限制,則刪除最舊的檔案,直到當前快取檔案的大小為最大快取大小的一半

總結

  • 介面設計簡單
    通常我們使用較多的UIImageView分類:

    一個簡單的介面將其中複雜的實現細節全部隱藏:簡單就是美。
  • 採用NSCache作為記憶體緩
  • 耗時較長的請求,都採用非同步形式,在回撥函式塊中處理請求結果
  • NSOperation和NSOperationQueue:可以取消任務處理佇列中的任務,設定最大併發數,設定operation之間的依賴關係。
  • 圖片快取清理的策略
  • dispatch_barrier_sync:前面的任務執行結束後它才執行,而且它後面的任務要等它執行完成之後才會執行。
  • 使用weak self strong self 防止retain circle
  • 如果子執行緒進需要不斷處理一些事件,那麼設定一個Run Loop是最好的處理方式

相關文章