**首先,SDWebImage 的圖片緩存採用的是 Memory(內存) 和 Disk(硬盤) 雙重 Cache 機制,SDImageCache 中有一個叫作 memCache 的屬性,它是一個 NSCache 對象,用於實現咱們對圖片的 Memory Cache,其實就是接受系統的內存警告通知,而後清除掉自身的圖片緩存。Disk Cache,也就是文件緩存,SDWebImage 會將圖片存放到 NSCachesDirectory 目錄中,而後爲每個緩存文件生成一個 md5 文件名, 存放到文件中。 總體機制以下:前端
Memory(內存)中查找:SDImageCache 類的 queryDiskCacheForKey 方法,查詢圖片緩存,queryDiskCacheForKey 方法內部, 先會查詢 Memory Cache ,若是查找到就直接返回,反之進入下面的硬盤查找。563513413,無論你是大牛仍是小白都歡迎入駐緩存
Disk(硬盤) 中查找:若是 Memory Cache 查找不到, 就會查詢 Disk Cache,查詢 Disk Cache 的時候有一個小插曲,就是若是 Disk Cache 查詢成功,還會把獲得的圖片再次設置到 Memory Cache 中。 這樣作能夠最大化那些高頻率展示圖片的效率。若是找不到就進入下面的網絡下載。網絡
網路下載:請求網絡使用的是 imageDownloader 屬性,這個示例專門負責下載圖片數據。 若是下載失敗, 會把失敗的圖片地址寫入 failedURLs 集合,爲何要有這個 failedURLs 呢, 由於 SDWebImage 默認會有一個對上次加載失敗的圖片拒絕再次加載的機制。 也就是說,一張圖片在本次會話加載失敗了,若是再次加載就會直接拒絕,SDWebImage 這樣作多是爲了提升性能。若是下載圖片成功了,接下來就會使用 [self.imageCache storeImage] 方法將它寫入緩存 ,同時也會寫入硬盤,而且調用 completedBlock 告訴前端顯示圖片。性能
Disk(硬盤)緩存清理策略:SDWebImage 會在每次 APP 結束的時候執行清理任務。 清理緩存的規則分兩步進行。 第一步先清除掉過時的緩存文件。 若是清除掉過時的緩存以後,空間還不夠。 那麼就繼續按文件時間從早到晚排序,先清除最先的緩存文件,直到剩餘空間達到要求。對象