原文請參考:http://m.itdecent.cn/p/9d114a82f77b
參照SDWebImage做,主要考慮以下幾點(diǎn)
- Manager
- Cache :內(nèi)存緩存、磁盤緩存
- downloader網(wǎng)絡(luò)下載
- 封裝視圖Category
- 圖片解碼、解壓縮
在圖片的存儲是以圖片的單向 hash 值為 Key
1.Manager
Manager用于管理downloader和Cache,設(shè)置options參數(shù),讓用戶設(shè)置緩存策略
- 下載失敗重試
- 只用磁盤數(shù)據(jù)
- 不用緩存數(shù)據(jù)等等
2.內(nèi)存緩存
內(nèi)存中緩存的數(shù)據(jù),需要考慮存儲的size,針對不同尺寸的圖片,給出不同的方案
- 10K 以下的50個(gè)
- 100Kb 以下的20個(gè)
- 100kb 以上的10個(gè)
內(nèi)存的淘汰策略 采取 LRU(最近最少使用算法)
觸發(fā)淘汰策略的時(shí)機(jī):
- 定期檢查(不建議,消耗性能)
- 提高觸發(fā)頻率:1.前后臺切換的時(shí)候 2.每次讀寫的時(shí)候
3.磁盤緩存
磁盤緩存需要考慮的問題如下
- 存儲方式
- 大小限制
- 移除策略(可以設(shè)置為7天)
4.網(wǎng)絡(luò)下載
- 圖片請求的最大并發(fā)量
- 請求超時(shí)策略
- 請求優(yōu)先級
5.圖片解碼解壓縮
針對jpg、png、gif等不同的圖片格式進(jìn)行解碼
解碼調(diào)用時(shí)機(jī)
- 子線程圖片下載完成時(shí)
- 子線程剛從磁盤讀取完成時(shí)
避免在主線程中解壓縮、解碼,避免卡頓
6.封裝視圖Category
基于Manager封裝響應(yīng)控件的Category
- (void)sd_setImageWithURL:(nullable NSURL *)url
placeholderImage:(nullable UIImage *)placeholder
options:(SDWebImageOptions)options
progress:(nullable SDImageLoaderProgressBlock)progressBlock
completed:(nullable SDExternalCompletionBlock)completedBlock;