产品需求:自定义的UITableViewCell上有图片需要显示,要求网络网络状态为WiFi时,显示图片高清图;网络状态为蜂窝移动网络时,显示图片缩略图。如下图样例:
首先,要监听网络状态,一般用AFNetWorking。
一般在AppDelegate.m文件中的application:didFinishLaunchingWithOptions:方法中监听网络状态。这里是判断当前网络的状态,然后再按网络的状态下载不同的图片。
用SDWebImange下载图片直接调用下面方法即可:
[self.imageView sd_setImageWithURL:[NSURLURLWithString:item.originalImage] placeholderImage:placeholder];
是不是感觉这样很简单?这样几句代码就搞定了。既判断了网络状态,还对应的作出了不同网络下载图片不一样的图片。
但是真实开发中,为了提高用户体验,并尽可能的减少用户流量的耗费等,就要考虑很多需要注意的细节:
1)SDWebImage会自动帮助开发者缓存图片(包括内存缓存,沙盒缓存),所以我们需要设置用户在WiFi环境下下载的高清图,下次在蜂窝网络状态下打开应用也应显示高清图,而不是去下载缩略图。
2)许多应用设置模块带有一个功能:移动网络环境下仍然显示高清图。这个功能其实是将设置记录在沙盒中。
3)当用户处于离线状态时候,无法合理处理业务。
要考虑到上述情况就得注意作出一下判断:
做出这样的判断问题就真的解决了吗?因为tableViewCell有重用机制,所以这样简单的判断还是会出现显示的问题。
比如,当用户所处环境WiFi网速不够快(不能立即将图片下载完毕),而在上述代码,在WiFi环境下又是下载高清大图。所以需要一定的时间来完成下载。而就在此时,用户不愿等,想看看上次打开App时显示的图片,此时用户会滑到处于下面的cell来查看。注意:此时,上面的cell下载图片操作并没有暂停,还在处于下载图片状态中。当用户在查看上次打开App的显示图片时(上次打开App下载完成的图片,SDWebImage会帮我们缓存,不用下载),而正好需要显示上次打开App时的图片的cell是利用tableView重用机制而从缓存池中拿出来的cell,等到处于上面的cell的高清大图已经下载好了的时候,SDWebImage默认做法是,立马把下载好的图片设置给ImageView,所以我们这时候会在底下的显示的cell显示上面的图片,造成数据错乱,这是非常严重的BUG。
解决方法就是:
如果能在cell被从缓存池中拿出来使用的时候,将这个cell放入缓存池之前的下载操作移除,那么就不会出现数据错乱了。
但是这里下载图片都是SDWebImage做的,但其实SDWebImage在下载图片之前,就已先关闭imageView当前的下载操作。
所以,只需要把所有的直接访问本地缓存代码利用SDWebImage进行设置就可以了。
这样,你所担心的问题全部都解决了。
喜欢记得给颗❤️。