最全SDWebImage-3.8版本源码阅读详解

 

一、前言

         SDWebImage,非常友好的网络图片加载第三方框架,在GitHub中已经获得了15000++的star,链接地址:https://github.com/rs/SDWebImage

         本人分析源码比较喜欢使用Xmind思维导图,非常方便做流程记录。所以,下面直接给大家伙看思维导图。

二、SDWebImage 优缺点

        2.1、纯属个人看法,优点可能不止这些,下面的有点个人觉得很值得学习。

      

 

      2.2、缺点嘛,我就找到一个。。。。。。

      

 

三、SDWebImage工作流程

      从下面的图可以很看出,高度高度解耦啊!!!!!!!全程采用block回调方式,爽!!!!

四、SDWebImage框架

      SDWebImage整体来说,主要是围绕了3个单例来进行,分别是SDWebImageManager管理器、 SDWebImageDownloader下载器、 SDImageCache缓存器单例

     4.1、分类入口

      UIButton+WebCache
      UIImageView+HighlightedWebCache
      UIImageView+WebCache
      UIButton和UIImageView,都是直接调用接口:- (void)sd_setImageWithURL:(NSURL *)url  负责传递URL

     4.2、SDWebImageManager管理器单例

      工作:负责管理图片获取和显示,协调SDImageCache缓存器和SDWebImageDownloader下载器工作。

     

 

     4.2、SDWebImageDownloader下载器单例     

       工作:通过自定义NSOperation,进行网络图片下载,回调Manager 的block。高度解耦,精华多多,值得学习!!!!!!

 

 

        4.3、SDImageCache 缓存器单例            

              工作:管理cache和disk图片增删查。

      

 

五、特别解惑

      1、为啥下载和从disk中读取的图片需要做Decode??

        由于UIImage的imageWithData函数是每次画图的时候才将Data解压成ARGB的图像,所以在每次画图的时候,会有一个解压操作,这样效率很低,但是只有瞬时的内存需求。为了提高效率通过SDWebImageDecoder将包装在Data下的资源解压,然后画在另外一张图片上,这样这张新图片就不再需要重复解压了。 这种做法是典型的空间换时间的做法。

      2、SDImageCache是怎么做数据管理的?

        SDImageCache分两个部分,一个是内存层面的,一个是硬盘层面的。内存层面是一个自定义大小的NSCache缓存器,以Key-Value的形式存储图片,当内存警告时时会清除所有缓存图片。用搜索文件系统的方式做管理,文件替换方式是以时间为单位,剔除时间大于一周的图片文件,文件的删除操作在进入后台或者退出程序是进行。当SDWebImageManager向SDImageCache要资源时,先搜索内存层面的数据,如果有直接返回,没有的话去访问磁盘,将图片从磁盘读取出来,然后做Decoder,将图片对象放到内存层面做备份,再返回调用层。

      3、如何避免重复下载???

          Downloader下载器单例维护NSOperationQueue管理当前所有下载操作,在下载之前,先遍历队列,比较operation id,如果正在下载,则不再下载,避免出现一个图片正在下载,但是未完成,通过operation id来判断,避免重复加入下载

 

      

 

posted on 2016-08-18 16:11  RobotZhu  阅读(459)  评论(0编辑  收藏  举报

导航