問題:
我們在用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)了這樣的功能

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

另一種解決方案:
imageView 對象和圖片的url 相關(guān)聯(lián),在滑動時,不取消舊的下載任務(wù),而是在下載任務(wù)完成回調(diào)時,進行url匹配,只有匹配成功的image會刷新imageView對象,而其他的image則只做緩存操作,而不刷新UI。
同時仍然管理一個執(zhí)行隊列,為了避免占用太多的資源,通常會對執(zhí)行隊列設(shè)置最大并發(fā)數(shù),此外,為了保證 隊列的下載策略,可以自己維持一個等待隊列,每次下載任務(wù)開始的時候,將后進入的下載任務(wù)插入到等待隊列的前面