美文网首页
SDWebImage 阅读笔记

SDWebImage 阅读笔记

作者: sunxu_cocoa | 来源:发表于2018-05-29 17:17 被阅读0次

    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大致的加载图片流程

    相关文章

      网友评论

          本文标题:SDWebImage 阅读笔记

          本文链接:https://www.haomeiwen.com/subject/ichajftx.html