SD 在复用cell时防止错乱的处理

问题:

我们在用SDwebImage 的时候,对tableView 上cell 的图片进行异步下载的时候,偶尔会出现图片回显错乱的问题,这由于cell 的重用机制,在我们加载出一个cell的时候imageView 数据源开启一个下载任务并返回一个image,当cell 重用时,其数据源又会开启一个下载任务下载新的image,但关联的对象是同一个imageView,这个时候直接setImage时会出现错乱。

SDWebImage的处理

imageView 对象会关联一个下载列表,列表是给AnimationImages用的,这个时候会下载多张图片,当tableView 滑动,imageView重设数据源url 时,会cancle掉下载列表中所有的任务
,然后开启一个新的下载任务。这样就保证了只有当前可见的cell对象的imageView对象关联的下载任务能够回调,不会发生image错乱。

即:每次下载前都先取消掉上一次的下载。那么你的图片下载器就需要实现取消下载功能,幸运的是SD这样的图片加载器已经实现了这样的功能


1.png

同时 SdWebImage 管理了一个全局下载队列(在DownloadManager中),并发量设置为6,可以说cell的数目大于6的时候,就会有部分下载队列处于等待状态,而且,在添加下载任务到全局的下载队列中去的时候,SDWebImage默认采取队列策略,具体是在添加下载任务的时候,将上次添加的下载任务添加依赖为新添加的下载任务。
SDWebImageDownloader中有段代码如下:


2.jpg

另一种解决方案:

imageView 对象和图片的url 相关联,在滑动时,不取消旧的下载任务,而是在下载任务完成回调时,进行url匹配,只有匹配成功的image会刷新imageView对象,而其他的image则只做缓存操作,而不刷新UI。

同时仍然管理一个执行队列,为了避免占用太多的资源,通常会对执行队列设置最大并发数,此外,为了保证 队列的下载策略,可以自己维持一个等待队列,每次下载任务开始的时候,将后进入的下载任务插入到等待队列的前面