問題:
我們?cè)谟肧DwebImage 的時(shí)候钉疫,對(duì)tableView 上cell 的圖片進(jìn)行異步下載的時(shí)候,偶爾會(huì)出現(xiàn)圖片回顯錯(cuò)亂的問題,這由于cell 的重用機(jī)制奄毡,在我們加載出一個(gè)cell的時(shí)候imageView 數(shù)據(jù)源開啟一個(gè)下載任務(wù)并返回一個(gè)image,當(dāng)cell 重用時(shí)贝或,其數(shù)據(jù)源又會(huì)開啟一個(gè)下載任務(wù)下載新的image吼过,但關(guān)聯(lián)的對(duì)象是同一個(gè)imageView锐秦,這個(gè)時(shí)候直接setImage時(shí)會(huì)出現(xiàn)錯(cuò)亂。
SDWebImage的處理
imageView 對(duì)象會(huì)關(guān)聯(lián)一個(gè)下載列表盗忱,列表是給AnimationImages用的酱床,這個(gè)時(shí)候會(huì)下載多張圖片,當(dāng)tableView 滑動(dòng)趟佃,imageView重設(shè)數(shù)據(jù)源url 時(shí)扇谣,會(huì)cancle掉下載列表中所有的任務(wù)
,然后開啟一個(gè)新的下載任務(wù)闲昭。這樣就保證了只有當(dāng)前可見的cell對(duì)象的imageView對(duì)象關(guān)聯(lián)的下載任務(wù)能夠回調(diào)罐寨,不會(huì)發(fā)生image錯(cuò)亂。
即:每次下載前都先取消掉上一次的下載汤纸。那么你的圖片下載器就需要實(shí)現(xiàn)取消下載功能衩茸,幸運(yùn)的是SD這樣的圖片加載器已經(jīng)實(shí)現(xiàn)了這樣的功能
同時(shí) SdWebImage 管理了一個(gè)全局下載隊(duì)列(在DownloadManager中),并發(fā)量設(shè)置為6贮泞,可以說cell的數(shù)目大于6的時(shí)候楞慈,就會(huì)有部分下載隊(duì)列處于等待狀態(tài),而且啃擦,在添加下載任務(wù)到全局的下載隊(duì)列中去的時(shí)候囊蓝,SDWebImage默認(rèn)采取隊(duì)列策略,具體是在添加下載任務(wù)的時(shí)候令蛉,將上次添加的下載任務(wù)添加依賴為新添加的下載任務(wù)聚霜。
SDWebImageDownloader中有段代碼如下:
另一種解決方案:
imageView 對(duì)象和圖片的url 相關(guān)聯(lián),在滑動(dòng)時(shí)珠叔,不取消舊的下載任務(wù)蝎宇,而是在下載任務(wù)完成回調(diào)時(shí),進(jìn)行url匹配祷安,只有匹配成功的image會(huì)刷新imageView對(duì)象姥芥,而其他的image則只做緩存操作,而不刷新UI汇鞭。
同時(shí)仍然管理一個(gè)執(zhí)行隊(duì)列凉唐,為了避免占用太多的資源,通常會(huì)對(duì)執(zhí)行隊(duì)列設(shè)置最大并發(fā)數(shù)霍骄,此外台囱,為了保證 隊(duì)列的下載策略,可以自己維持一個(gè)等待隊(duì)列读整,每次下載任務(wù)開始的時(shí)候簿训,將后進(jìn)入的下載任務(wù)插入到等待隊(duì)列的前面