仿照SDWebImage實(shí)現(xiàn)圖片下載思路

第一步構(gòu)造圖片下載的類WYWebImageManager

1.構(gòu)造下載方法

2.內(nèi)存中拿到圖片

3.從磁盤中獲取數(shù)據(jù)

3.1判斷當(dāng)前任務(wù)是否在下載避免重復(fù)下載


3.2自定義NSOperation下載當(dāng)然SD 用的是NSURLSession 我這里為了方便就沒這樣,以后有時(shí)間我在繼續(xù)改


我來解釋下handdict為什么要這樣寫,如果看不懂和我交流


第二步自定義WYWebImageDownLoadOperation

2.1重載start方法

重載父類的方法,但是在ios4以后,不管是并發(fā)還是非并發(fā),隊(duì)列都會為operation提供一個(gè)線程來執(zhí)行。所以isConcurrent這個(gè)變量也就沒有用處了。但是,這里還設(shè)涉及到了兩個(gè)方法,start和main.按照官方文檔所說,如果是非并發(fā)就使用main,并發(fā)就使用start。

那現(xiàn)在并發(fā)和非并發(fā)已經(jīng)沒有區(qū)別了,start和main的區(qū)別在哪里呢?

main方法的話,如果main方法執(zhí)行完畢,那么整個(gè)operation就會從隊(duì)列中被移除。如果你是一個(gè)自定義的operation并且它是某些類的代理,這些類恰好有異步方法,這是就會找不到代理導(dǎo)致程序出錯(cuò)了。

然而start方法就算執(zhí)行完畢,它的finish屬性也不會變,因此你可以控制這個(gè)operation的生命周期了。

然后在任務(wù)完成之后手動cancel掉這個(gè)operation即可。

具體實(shí)現(xiàn)


鎖采用的是信號量,較早的sd版本的有@synchronized,后來改成了信號量,信號量在不涉及到磁盤讀寫的時(shí)候性能非常高,

2.操作任務(wù)



重載父類的屬性


1.將KVO改成手動關(guān)閉自動,保證不會被隨意調(diào)用

第三步UIImageView+WYWebCache

1.為外界提供下載方法

if (self.wy_urlString && self.wy_urlString.length>0 && ![self.wy_urlString isEqualToString:urlString])

第4步外界調(diào)用

這就是仿照SDWebImage的實(shí)現(xiàn)圖片下載的思路

其他

1處理內(nèi)存警告

2.加載圖片路徑


與SD不同的是SD用實(shí)在NSCache里面創(chuàng)建了一個(gè)Default文件夾管理自己下載的圖片,這樣話不會影響到我們的app 其他放在Cache的文件

3.清理內(nèi)存


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

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

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