概要
? ? 學(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進(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。

? ? 由此,基本功能基本完成。但有個無關(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)式加載圖片的思路。
