SD 在復用cell時防止錯亂的處理

問題:

我們在用SDwebImage 的時候,對tableView 上cell 的圖片進行異步下載的時候,偶爾會出現(xiàn)圖片回顯錯亂的問題,這由于cell 的重用機制,在我們加載出一個cell的時候imageView 數(shù)據(jù)源開啟一個下載任務(wù)并返回一個image,當cell 重用時,其數(shù)據(jù)源又會開啟一個下載任務(wù)下載新的image,但關(guān)聯(lián)的對象是同一個imageView,這個時候直接setImage時會出現(xiàn)錯亂。

SDWebImage的處理

imageView 對象會關(guān)聯(lián)一個下載列表,列表是給AnimationImages用的,這個時候會下載多張圖片,當tableView 滑動,imageView重設(shè)數(shù)據(jù)源url 時,會cancle掉下載列表中所有的任務(wù)
,然后開啟一個新的下載任務(wù)。這樣就保證了只有當前可見的cell對象的imageView對象關(guān)聯(lián)的下載任務(wù)能夠回調(diào),不會發(fā)生image錯亂。

即:每次下載前都先取消掉上一次的下載。那么你的圖片下載器就需要實現(xiàn)取消下載功能,幸運的是SD這樣的圖片加載器已經(jīng)實現(xiàn)了這樣的功能


1.png

同時 SdWebImage 管理了一個全局下載隊列(在DownloadManager中),并發(fā)量設(shè)置為6,可以說cell的數(shù)目大于6的時候,就會有部分下載隊列處于等待狀態(tài),而且,在添加下載任務(wù)到全局的下載隊列中去的時候,SDWebImage默認采取隊列策略,具體是在添加下載任務(wù)的時候,將上次添加的下載任務(wù)添加依賴為新添加的下載任務(wù)。
SDWebImageDownloader中有段代碼如下:


2.jpg

另一種解決方案:

imageView 對象和圖片的url 相關(guān)聯(lián),在滑動時,不取消舊的下載任務(wù),而是在下載任務(wù)完成回調(diào)時,進行url匹配,只有匹配成功的image會刷新imageView對象,而其他的image則只做緩存操作,而不刷新UI。

同時仍然管理一個執(zhí)行隊列,為了避免占用太多的資源,通常會對執(zhí)行隊列設(shè)置最大并發(fā)數(shù),此外,為了保證 隊列的下載策略,可以自己維持一個等待隊列,每次下載任務(wù)開始的時候,將后進入的下載任務(wù)插入到等待隊列的前面

最后編輯于
?著作權(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ù)。

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