異步加載網(wǎng)絡(luò)圖片

概要

? ? 學(xué)習(xí)SDWebImage后自己嘗試寫出的異步加載網(wǎng)絡(luò)圖片的庫。從開始到完工經(jīng)歷大大小小的改版。

? 使用編程語言:Object-C。 ??

? 功能:異步加載網(wǎng)絡(luò)圖片資源(圖片、GIF)、加載本地GIF、漸進(jìn)式下載圖片。

如何使用

? ? 導(dǎo)入"UIImageView+URLImage.h",調(diào)用- (void)loadURLImageWith:(NSString*)url placeImage:(UIImage*)placeImage方法。

? ? GitHub地址:https://github.com/zhangzecheng/URL-Image。 (歡迎大家下載提出寶貴建議,順便點贊)

UIImageView+URLImage.h

? ? 目前只對UIImageView進(jìn)行添加分類加載網(wǎng)絡(luò)圖片。若其他控件也需要異步加載網(wǎng)絡(luò)圖片,可模仿代碼中UIImageView的調(diào)用方法。

思路(貼圖為最新代碼)

? ? 一開始只是用NSData的dataWithContentsOfURL方法結(jié)合多線程,這樣做的直觀結(jié)果就是加載圖片過程中APP不卡,可以順暢的做其他操作。當(dāng)另外的控件也需要加載這張圖片時,卻照樣需要重走下載的流程。因此衍生出了緩存+沙盒的緩存機(jī)制。

? ? 加載圖片的URL,先在緩存中查找是否下載過。沒有則去沙盒中查找。若沙盒里也沒有保存對應(yīng)的圖片資源(圖片、GIF),則去下載隊列里找,避免重復(fù)下載。此時將加載圖片資源的回調(diào)(ZCImageCompletion)保存起來,再去判斷是否已在下載隊列中,沒有在開啟下載功能。

下載圖片過程

這三個公有方法便是整個異步加載的圖片資源,為方便使用,已經(jīng)將其寫在一個方法里。

加載圖片過程

? ?最初的“緩存”使用的是字典,可當(dāng)APP內(nèi)存不足時無法自動釋放,由此使用NSCache替換。NSCache當(dāng)APP內(nèi)存警告時自動清除,這里不再贅述。

? ?網(wǎng)絡(luò)請求返回的data直接轉(zhuǎn)為UIImage即可顯示,保存到緩存、沙盒中;若是加載GIF,則需要用data去創(chuàng)建一個CGImageSourceRef,遍歷CGImageSourceRef通過CGImageSourceCreateImageAtIndex拿到每一個CGImageRef,生成對應(yīng)的UIImage,調(diào)用[UIImage animatedImageWithImages:imagesArrM duration:duration]來生成可加載GIF的UIImage。

加載GIF

? ? 由此,基本功能基本完成。但有個無關(guān)緊要的問題,便是當(dāng)要加載的圖片過大時,雖然可以使用占位圖在APP上顯示讓界面不會有太多的空白??捎行┬枨笫窍肟吹郊虞d的過程。由此變引入漸進(jìn)式加載圖片的功能。為了引入這個功能,對代碼進(jìn)行重新設(shè)計,剔除了“多線程+dataWithContentsOfURL”模式,引入了NSURLSession的類,用其進(jìn)行網(wǎng)絡(luò)圖片資源的加載,并用ZCImageSource這個類來代表圖片資源。

? ? 在NSURLSession的代理方法- (void)URLSession:(NSURLSession*)session dataTask:(NSURLSessionDataTask*)dataTask ?didReceiveData:(NSData*)data中,我們能拿到每次返回的數(shù)據(jù),并將其拼接到之前已下載的data中,每次拿到data就將data轉(zhuǎn)為UIImage,這就是漸進(jìn)式加載圖片的思路。

設(shè)置
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容