SDWebImage源碼解讀

之前只知道如何使用,如今我想進階一下知道他的原理,要知其然,更要知其因此然。前端

SDWebimage實現簡單的步驟以下:
緩存

1.在顯示圖片以前,先檢查內存緩存中時候有該圖片;bash

2.若是內存緩存中有圖片,那麼就直接使用,不下載;學習

3.若是內存緩存中無圖片,那麼再檢查是否有磁盤緩存;

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還有不少值得咱們借鑑和學習的地方,須要你們細細研讀,更深層次的學習它內部處理的思路。之後本身理解深刻了,再作一些詳細的介紹。

相關文章
相關標籤/搜索