圖片下載框架概述
hejunm發表於2019-01-11
圖片下載需要解決(考慮)哪些問題?
記憶體快取
- FIFO雙向佇列+LRU雙向佇列+map資料結構。可以參考LKImageKit。
本地快取
- 儲存解碼前的。解碼後佔用空間太大;
- 非同步IO執行緒讀取本地圖片資料,sdWebImage解碼是在非同步單執行緒中,當瞬時載入大量圖片時,可能會是效能瓶頸。可以嘗試在多個執行緒進行解碼。
合併請求
- 確保一張圖片不會請求多次
- sdWebImage中,一個下載對應一個operation。多次重複請求時,新增多個block。
取消請求
- 可以只刪除對應回撥block。下載,解碼,儲存記憶體快取,儲存磁碟快取照樣繼續進行。(快速滑動列表時,很大概率會再划過來)。
- 取消下載等操作。(一個下載operation,沒有對應回撥時直接cancle).
- 提供兩種方案,根據不同業務形態進行選擇。
主流圖片格式解碼方案?
- 子執行緒解碼。SDWebImage使用序列佇列進行解碼。估計是為了實時下載,解碼,顯示(這種場景下,如果使用併發佇列,順序可能亂掉)這裡應該可以優化。
- 如果只是下載結束後解碼,可以考慮使用非同步多執行緒解碼。
- 解碼格式主要有: Png/jpeg/webP等。 SDWebImage有對應解碼模組。
- GIF:使用FLAnimatedImage
漸進式載入
- 可以逐行載入 或 模糊到清晰的載入,
- 參考sdwebImage。個人感覺從模糊到清晰的使用者體驗更好。
- 具體實施時,可以調研下主流APP是否漸進顯示。
極致優化
參考框架