SDWebImage框架重要的細節

2021-07-29 19:00:37 字數 3031 閱讀 6920

作者enrica 

關注 2017.02.13 11:05

字數 1897

閱讀 104

喜歡 5

我們在前面的筆記《sdwebimage的基本使用》中學習了該框架的一些基本知識,接下來,再看一下它內部的一些細節。

1、最大併發數

在學習nsoperation的時候,我們知道,執行緒的最大併發數預設值是-1,也就是不設限。那麼,在sdwebimage中,執行緒的最大併發數是多少呢?

預設最大的併發數.png

2、佇列中任務的執行順序

在sdwebimage**********這個類中,有乙個屬性executionorder,它表示任務的執行順序,其型別是乙個列舉。可以進到這個列舉的實現**中看一下:

這個列舉總共只有兩個成員,其中,sdwebimage**********fifoexecutionorder表示佇列中的任務按照"先進先出"的順序執行;而sdwebimage**********lifoexecutionorder表示佇列中的任務按照"後進先出"的順序執行。再回到- init方法中,我們看到,executionorder預設是按照"先進先出"的順序執行任務的:

佇列中任務預設的執行順序.png

3、快取檔案的命名

在《多執行緒技術的綜合應用》這篇筆記中,當時我們處理沙盒快取的時候,快取檔案的命名用的是url位址最後乙個節點。那麼,在sdwebimage框架中,它又是怎麼命名沙盒快取檔案的名稱呢?可以進入專案沙盒快取目錄去看一下(具體的進入方式,參見《如何快速定位應用的沙盒存放路徑》):

在沙盒快取中的名稱.png

從的url位址,以及它在沙盒中快取檔案的名稱上看,顯然不是簡單的用url位址最後乙個節點的名稱來命名的。實際上,快取檔案的命名還是和的url位址有關係,只不過,它多做了一層處理。

在sdwebimage中,沙盒快取檔案的命名是用的url位址經過md5加密之後得到的字串兒來命名的。可以在終端用echo -n "的url位址" | md5命令來驗證:

對的url位址做md5加密處理.png

從上面的圖中,我們看到,經過md5加密過後的url位址所得到的字串兒,正好和上面沙盒中快取檔案的名稱一致。

4、對記憶體警告的處理

來到sdimagecache這個類中,可以看到它裡面有乙個- init方法。在這個方法中,通過註冊通知來監聽記憶體警告並移除資料:

在- init方法中用通知來監聽記憶體警告的方法來清理資料.png

除了在- init方法中可以處理記憶體警告之外,還有乙個- initwithnamespace: diskcachedirectory:方法,也是用註冊通知的方式來監聽記憶體警告並清理快取的:

還是通過註冊通知來監聽記憶體警告.png

5、對快取檔案的處理

在《多執行緒技術的綜合應用》這篇筆記中,當時我們實現快取機制時,用的是乙個可變字典(nsmutabledictionary)。那麼,在sdwebimage框架中,它是怎麼實現快取的呢?可以來到sdwebimage處理快取的類sdimagecache中看一下:

對快取檔案的處理.png

從上面的圖中我們可以看到,它用的是nscache。nscache是蘋果提供的專門用來處理快取的乙個類,相比而言,比nsdictionary更專業。

6、對型別的判斷

在nsdata+imagecontenttype這個分類中,它有乙個類方法+ sd_contenttypeforimagedata:就是專門用來判斷各種型別的。其主要思路是,拿到一張十六進製制資料的第乙個位元組進行判斷,然後再根據不同的結果返回的真實型別。只要是同一種型別的,它十六進製制資料的第乙個位元組都是相同的。在xcode中可以檢視的十六進製制形式,因此,也可以通過檢視不同型別的十六進製制編碼來驗證這一思路。具體的檢視方式如下圖所示:

以十六進製制的形式檢視一張.png

sdwebimage就是運用同一種型別的,它十六進製制資料的第乙個位元組編碼是固定不變的這一特性來判斷真實型別的。gif的十六進製制形式如下圖所示:

gif的十六進製制形式.png

jpeg十六進製制資料的第乙個位元組是0xff,png十六進製制資料的第乙個位元組是0x89,gif十六進製制資料的第乙個位元組是0x47。

7、網路請求超時的具體時間

來到sdwebimage**********這個類中,還是在- init這個方法裡,可以看到,downloadtimeout預設的值是15秒:

網路超時的時長設定.png

也就是說,在sdwebimage框架中,網路請求超時的時長被設定為15秒。

SDWebImage的快取處理

使用sdwebimage請求資料,會產生相應的快取 這是用於顯示快取大小 呼叫方法 self filepath 即可獲得當前快取大小 顯示快取大小 float filepath 1 首先我們計算一下單個檔案的大小 longlong filesizeatpath nsstring filepath r...

SDWebImage的原始碼解讀

sdwebimage共有17個oc檔案以及乙個多餘的標頭檔案,下面將會按照順序乙個乙個進行檔案的解讀 本人學藝不精,如果有不對的地方歡迎指出,有些細節的東西我也不算很理解,寫下這邊也算是方便以後用到的時候回顧 1.imagecontexttype 檔案 主要提供識別資料的格式,是nsdata的分類,...

iOS開發 SQLite重要框架FMDB的使用

什麼是fmdb fmdb是乙個和ios的sqlite資料庫操作相關的第三方框架。主要把c語言運算元據庫的 用oc進行了封裝。使用者只需呼叫該框架的api就能用來建立並連線資料庫,建立表,查詢等。為什麼要使用fmdb 1 輕量級,靈活。不消耗太多效能 2 fmdb將c語言的ios系統的sqlite資料...