iOS开发中SdWebImage可以说是作为图片下载的利器,下面就大概说一下它的原理。
1.我们在调用图片异步下载的方法的时候:
[self.goodsPic sd_setImageWithURL:[NSURL URLWithString:goodsM.pic1]];
在其内部实现中它都会首先去调用:
[self sd_cancelCurrentImageLoad];
它会先去查看视图中,当前是否存在异步下载操作的缓存,如果有就取消掉(并且这个操作会对应一个特定的key值,例如在UIImageView里面它对应的是UIImageViewImageLoad);
2.在执行完[self sd_cancelCurrentImageLoad];
之后,下面的逻辑就是通过URL字符串作为key值去沙盒中查找是否有对应的图片,有的话就显示出来,没有的话就要建立一个异步下载操作,去网络下载,同时还有重要的一步,就是要把这个操作缓存起来
疑惑:为什么要去执行[self sd_cancelCurrentImageLoad];
?
-
是为了在Tableview中,解决cell数据显示混乱的问题。因为我们在拖动TableView的时候,cell会不停的赋值新的数据,如果不将缓存的异步操作取消掉,有可能它会显示其他行的数据,因为网络下载有快慢,有可能上一个操作还没下载完,而在前操作下载完成之后,上一个操作刚好下载完成,这时候数据相当于不对应了。
-
这也就是为什么我们要将异步操作缓存到字典中的原因,因为可以通过key值获取到他,然后取消掉
-
个人觉的这也是为什么这个框架要用NSOperation的原因,因为它是基于GCD进行的封装,更加面向对象,当缓存操作的时候,直接把异步操作对象缓存到字典就可以了。
-
并且里面用的是自定义NSOperation,当自定义NSOperation的时候,我们可以重写它的main方法,在这个方法中把操纵分装起来,同时在执行那些耗时的连续性操作的时候我们能来判断当前的isCancel属性是否为YES,如果是可以终止这个操作,这也是自定义NSOperation的好处。(因为如果用系统的的类来写的话,一些已经开始了的耗时操作,你是无法取消的,能取消掉的只是那些将要执行的操作)
网友评论