最近考慮對項(xiàng)目的網(wǎng)絡(luò)圖片庫進(jìn)行重構(gòu)辣往,寫點(diǎn)東西記錄一下思路驼侠。
首先現(xiàn)有的架構(gòu)有什么問題呢热凹?
現(xiàn)有的網(wǎng)絡(luò)圖片架構(gòu)只是對網(wǎng)絡(luò)庫做了簡單的封裝
- 實(shí)現(xiàn)了代理模式的接口
<pre><code>- (void)downloadImageByUrl:(NSString)url savePath:(NSString)savePath delegate:(id)delegate action:(SEL)action withObject:(id)obj;</code></pre> - 基于NSFileManager的文件緩存,但封裝度不夠泪电,十分難用
- 用NSThread實(shí)現(xiàn)了一個從zip包中解壓出圖片般妙,異步加載
顯然,無論從性能或者接口友好度上看相速,都很low......
- 下載操作在主線程碟渺,
- 代理模式,每次都要寫SEL
那么優(yōu)秀的圖片加載庫應(yīng)該是什么樣的突诬?
1.友好的接口
應(yīng)該減少對業(yè)務(wù)代碼的侵入苫拍,毫無疑問,Category是最好的方式旺隙。這三個框架都是這種方式绒极,SDWebImage為例:
<pre><code>- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder;</code></pre>
2.多線程異步下載、全局隊(duì)列執(zhí)行下載
多線程異步下載提高性能蔬捷,全局隊(duì)列保證不重復(fù)加載同一張圖片
SDWebImage垄提、AFNetworking的最新版本使用NSURLSession
YYWebImage使用NSURLConnection
我不知道這兩套API有多少差別榔袋,蘋果在iOS9已經(jīng)宣布棄用NSURLConnection
3.后臺圖片解碼,支持主流格式
UIImage被創(chuàng)建時(shí)候铡俐,并沒有進(jìn)行解碼凰兑。當(dāng) UIImage 第一次顯示到屏幕上時(shí),其內(nèi)部的解碼方法才會被調(diào)用审丘,同時(shí)解碼結(jié)果會保存到一個全局緩存去吏够。
所以支持后臺解碼是能夠提高性能的。
這三個框架都支持后臺線程解碼滩报,至于主流圖片格式锅知,不具體分析了。
4.緩存
緩存方式 | 內(nèi)存緩存 | 硬盤緩存 |
---|---|---|
SDWebImage | SDImageCache (基于NSCache) | NSFileManager |
AFNetworking(2.x) | NSCache | 貌似沒有diskCache脓钾? |
AFNetworking(3.x) | AFAutoPurgingImageCache | NSURLCache |
YYWebImage | YYCahce(基于NSCache) | YYCahce(NSFileManager+DB) |
- SDWebImage也是支持NSURLCache的喉镰,但同時(shí)使用會造成重復(fù)緩存。
- NSURLCache本身也有內(nèi)存緩存惭笑,有些博客認(rèn)為NSURLCache緩存的是Http協(xié)議中返回的response侣姆,response到UIImage這一過程,會帶來額外的開銷沉噩,但我實(shí)際使用過程中發(fā)現(xiàn)捺宗,NSURLCache的硬盤緩存也分成fileSystem和DB,沙盒目錄下有個fsCachedData文件夾保存了圖片(川蒙?歡迎指正)蚜厉。
- YYCahce 根據(jù)作者大神做的測評,性能很屌畜眨,甩別人幾條街那種~ ibireme大神博客
- 至于disk的緩存時(shí)間昼牛,NSFileManager應(yīng)該比較容易實(shí)現(xiàn)針對單個緩存的設(shè)置緩存時(shí)間,但SDWebImage目前是統(tǒng)一的緩存時(shí)間康聂;YYCache目前也只有統(tǒng)一的緩存過期時(shí)間贰健;NSURLCache緩存時(shí)間是由服務(wù)器決定的(待驗(yàn)證)。
5. 其他很fashion的特性
- 漸進(jìn)式加載
- 本地文件加載
- 常見圖片處理恬汁,裁剪伶椿、圓角等等
這個方面 YYWebImage 做的最好
總結(jié)
任意框架來替代項(xiàng)目的現(xiàn)有方案,都可以滿足需求氓侧,并且會有很大的性能提升(希望是)脊另。我比較中意YYWebImage,美中不足的就是NSURLConnection约巷,畢竟NSURLSession才是美好未來偎痛。