1. 程式人生 > >iOS中網路圖片的下載

iOS中網路圖片的下載

1.    SDWebImage的簡單介紹

  a)       SDWebImage支援非同步圖片下載+快取,提供了UIImageView+WebCacha的分類,方便使用。

  b)       圖片檔案快取的時間最長是1周

  c)        記憶體快取使用的是NSCache

  d)       最大併發數是6,可以經過屬性調整

  e)       支援GIF

  f)        快取圖片的名稱使用MD5雜湊函式,對url進行md5,結果是32個字元長度的字串。

  g)       接收到記憶體警告怎麼處理

                     i.           接收到記憶體警告通知執行clearMemory方法,清理記憶體快取

                    ii.           接收到應用程式將要終止通知,執行clearDisk方法,清理磁碟快取,將快取的資料夾直接刪除,重新建立新的緩    存資料夾。

                   iii.           接收到進入後臺通知,執行backgroundCleanDisk方法,後臺清理磁碟

2.    SDWebImage的底層原理

  a)       從分類入口setImageWithURL,會先把展點陣圖顯示出來

  b)       然後進入SDWebImageManage管理類,交給SDImageCache從快取中查詢圖片是否已經下載

  c)        先從記憶體圖片快取中查詢是否有圖片,找到有快取就把圖片回傳到管理類在回傳到分類入口顯示

  d)       如果記憶體中沒有該圖片的快取,生成操作新增到佇列從磁碟查詢圖片檔案

  e)       根據url的md5字串,查詢磁碟快取圖片,如果找到則回主執行緒進行結果的回撥,新增到記憶體快取中(空閒記憶體過小,會先清    空記憶體快取)

  f)        如果磁碟沒有讀取到圖片,說明所有快取都沒有該圖片,則需要回調到管理類,生成下載管理器下載圖片

  g)       下載圖片是又NSURLConnetction來做,實現了相關的代理判斷圖片下載狀態和下載進度。

  h)       圖片資料下載完成後,會交給SDWebImageDecoder做圖片解碼處理,這裡是一個佇列操作,不會拖慢主執行緒

  i)         解碼完成,會到管理類,進行圖片的快取到記憶體和磁碟的操作,最終回到分類顯示出圖片

  j)         在SDWebCache初始化的時候,會註冊訊息通知,在記憶體警告和後臺的時候清理記憶體快取,應用結束的時候清理過期的圖  片。

3.    SDWebImage庫的作用:

  a)       UIImageView(WebCache)分類,入口封裝

  b)       SDWebImageManager 對圖片的管理中繼站,向下呼叫快取(SDWebCache)和網路下載(SDWebImageDownloader)操作,已接響應他們的回撥

  c)        SDImageCache根據url進行了記憶體和磁碟的兩種儲存和讀取操作,以及一些快取的清理操作

  d)       SDWebImageDownloader根據URL向網路下載圖片資料等操作

  e)       SDWebImageDecoder,非同步對圖片進行一次解壓,能夠提高效率。

4.    SDWebImage怎麼封裝

  a)       在UIImageView分類封裝2個方法,下載圖片的方法和佔位圖的

  b)       常用的還有封裝一個回撥下載圖片狀態和進度的《下載成功,下載失敗,下載進度》

5.    SDWebImage和YYWebImage對Gif圖片展示的記憶體、CPU使用分析

  a)       SDWebImage記憶體暴漲,CPU佔用低

  b)       YYWebImage記憶體低了,CPU居高不下

  c)        SDWebImage是把GIF所有的圖片都先載入到記憶體中,通過animatedImageWithImages的方式播放動畫。這樣的好處就是,播放時直接從記憶體中讀取資源就好了。典型的以空間換取流暢度

  d)       YYWebImage的處理方式正好相反,讀取Gif需要展示的當前image,進行解析展示,不用為gif的每一張圖片開闢空間,每次都是讀取一張image就好了。以速度換空間。

  e)       後期YYWebImage好像解決了這個cpu高佔用的問題,使用了一個自定義的UIImageView ,YYAnimatedImageView來播放GIF

  f)        具體使用哪個,就需要根據不同的業務需求進行決定了