之前只知道如何使用,如今我想進階一下知道他的原理,要知其然,更要知其因此然。前端
SDWebimage實現簡單的步驟以下:
緩存
1.在顯示圖片以前,先檢查內存緩存中時候有該圖片;bash
2.若是內存緩存中有圖片,那麼就直接使用,不下載;學習
4.若是磁盤緩存中有圖片,那麼直接使用,還須要保存一份到內存緩存中(方便下一次使用);url
5.若是磁盤緩存中無圖片,那麼再去下載,而且把下載完的圖片保存到內存緩存與磁盤緩存中。spa
根據咱們的步驟,跳進SDWebimage的源碼看看,咱們調用的是以下這個方法:code
[self.imageView sd_setImageWithURL:[NSURL URLWithString:model.thumb_url?:@""] placeholderImage:[UIImage imageNamed:@""]];複製代碼
一步步進入到以下方法中:cdn
經過下圖咱們能夠清楚的看到:第一步判斷的是圖片是否存在,初始化SDWebImageManagerblog
再判斷SDImageCache中是否存在圖片,若是存在則調用sdImageCacheDelegate返回到前端顯示;若是沒有在SDImageCache中找到圖片,則生成NSInvocationOperation添加到隊列中,在磁盤中查找,找到則回調;沒找到,則共享或生成下載器SDWebImageDownLoader開始下載圖片,由NSURLConnection來執行,下載完畢後圖片解碼在NSOperationQueue中執行,在notifyDelegateOnMainThreadWithInfo中告訴解碼完成
隊列
progressblock中也能夠看到下載的進度,
在這裏顯示進度和是否下載完畢:
通知全部的 downloadDelegates 下載完成,回調給須要的地方展現圖片。
圖片保存到 SDImageCache 中,內存緩存和硬盤緩存同時保存。
看完以後真是膜拜大神,這只是簡單的實現過程,尚未查看各個分類具體的操做。之後有時間在,好好研究一下各個分類的處理。在看其餘博客的時候,看到一個流程解釋很全面的圖,附上:
SDWebImage還有不少值得咱們借鑑和學習的地方,須要你們細細研讀,更深層次的學習它內部處理的思路。之後本身理解深刻了,再作一些詳細的介紹。