SDWebImage作为一个IOS开发者肯定或多或少都有了解,如果你不是自己做图片缓存处理那么很大概率就是就用它了,之所以用它没什么别的原因,两个字好用。
既然这么牛逼,那肯定要一探究竟,看看作者是如何将网络图片给加载出来的。
先看一下这张图,此图展示了整个运行流程。大致运行逻辑就是先从内存中找资源,找到返回,找不到从本地缓存中找,找到之后缓存到内存中方便下次使用同时返回这个资源,如果两者都没有找到,此时从网络下载,下载完之后保存本地并缓存到内存中。
然后看一下整个框架结构,下面这张图是从James老师的的视频里截图的。
接下来分析一下具体的代码逻辑
首先
这个方法比较通用,需要传三个参数,URL,展位图,和获取资源策略默认0。
然后进入
然后进入
进入这个方法之后首先调用了 [self sd_cancelCurrentImageLoad]方法,之所以这么做是为了防止闪屏,什么意思呢,比如说给cell传入一个url_1然后开始下载,这个时候还没有下载完成就将这个cell向上滑出屏幕,然后又从下面滑出来,这就是cell的重用机制,这个时候又给cell传入一个url_2,也就是说这个cell同时管理者两个图片,就会出现一个现象,先出现一张图片然后很快又变回另一个。
接下来又调用了objc_setAssociatedObject(self, &imageURLKey, url, OBJC_ASSOCIATION_RETAIN_NONATOMIC);这个是干嘛的,它是runtime里面的方法,动态的关联属性,为什么要动态的关联属性而不事先写好呢,因为。。。。。。。UIImageView+WebCache这个类是UIImageView的分类所以只能采用这个方式添加属性。
objc_setAssociatedObject(id _Nonnull object, const void * _Nonnull key,
id _Nullable value, objc_AssociationPolicy policy)
可以看到这个函数需要传入四个函数分别是被绑定的对象,键,绑定的值和策略,这个策略有几个选项
OBJC_ASSOCIATION_ASSIGN = 0,
OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1,
OBJC_ASSOCIATION_COPY_NONATOMIC = 3,
OBJC_ASSOCIATION_RETAIN = 01401,
OBJC_ASSOCIATION_COPY = 01403 类似于assign,retain,copy。
而这个键一般用静态字符常量,用来保存和获取所关联的值。
然后下面就进入正题了
进入- (NSOperation *)queryDiskCacheForKey:(NSString *)key done:(SDWebImageQueryCompletedBlock)doneBlock方法内部瞅瞅
一般操作沙盒都用异步。
然后如果返回值为空的话调用下面这个方法,进入下载模块。
进入看看里面具体操作
首先创建一个请求配置一些参数,然后调用下面这个方法进入最终的下载类SDWebImageDownloaderOperation
下载完之后返回图片,同时保存图片到本地和内存中。这就是SDWebImage大致的加载图片流程
网友评论