美文网首页iOS 知识点移动开发ios 知识点
SDWebImage 4.x版本源码分析(一)图解!!!

SDWebImage 4.x版本源码分析(一)图解!!!

作者: 快乐的老船长 | 来源:发表于2018-03-17 16:49 被阅读969次

    本文分析的 SDWebImage 版本为4.3.2。可以来这里下载一下源码注释

    一、为什么会出现SDWebImage?
    二、SDWebImage不同版本的区别
    三、SDWebImage的使用
    四、解读SDWebImage UML 类图 和 流程图
    五、详细的类的解析和该类的流程
    - UIView+WebCache、SDWebImageManager
    - SDWebImageDownloader
    - SDWebImageCache
    - SDWebImageDownloaderOperatiion
    - 问题总结


    一、为什么会出现SDWebImage?

    SDWebImage作者 Olivier Poitrey

    在SDWebImage 1.0版本的文档里说,由于用网络图片对UITableView缺乏支持用起来很难受,Google一番后也没有发现有哪个简单的库来为您执行异步图像抓取+缓存工作。

    于是他找了他的好朋友Sebastien Flory(Fraggle)寻求帮助,后来他发现用NSOperation类来管理并发,UITableView中图片的加载响应速度提升很多。因此他重写了Fraggle的实现。

    二、SDWebImage不同版本的区别

    2.x

    • 将UIImageView类图像和缓存管理添加到Cocoa Touch框架的类别
    • 异步图片下载器
    • 异步内存+磁盘映像缓存,并且自动处理过期的缓存图片
    • 后台图像解压缩
    • 保证相同的URL不会被多次下载
    • 保证伪造的URL不会一次又一次地重试
    • 保证主线程永远不会被阻塞

    3.x

    • 将UIImageView类图像和缓存管理添加到Cocoa Touch框架的类别
    • 异步图片下载器
    • 异步内存+磁盘映像缓存,并且自动处理过期的缓存图片
    • 后台图像解压缩
    • 保证相同的URL不会被多次下载
    • 保证伪造的URL不会一次又一次地重试
    • 保证主线程永远不会被阻塞

    新增功能:

    • 动画GIF支持
    • WebP格式支持
    • 使用GCD和ARC
    • Arm64支持

    4.x

    • 类别UIImageView,UIButton,MKAnnotationView添加Web图像和高速缓存管理
    • 异步图片下载器
    • 异步内存+磁盘映像缓存,并且自动处理过期的缓存图片
    • 后台图像解压缩
    • 保证相同的URL不会被多次下载
    • 保证伪造的URL不会一次又一次地重试
    • 保证主线程永远不会被阻塞
    • 使用GCD和ARC

    说明上看起来没什么区别

    从文件上看
    新增

    • 缓存配置类 SDImageCacheConfig
    • 一堆Decoder类 对之前SDWebImageDecoder补充优化
    • 图像变换类 SDWebImageTransition
    • category 新增功能调用接口
    image.png image.png

    对于GIF图的展示

    • 从4.0版本开始,我们依靠FLAnimatedImage来照顾我们的动画图像。
    • 要使用它,只需确保你我们FLAnimatedImageView而不是UIImageView。
    • 注意:有一个向后兼容的功能,所以如果你还在试图加载GIF成UIImageView,它只会显示第一帧为静态图像。
    • 重要提示:FLAnimatedImage仅适用于iOS平台,因此对于所有其他平台(OS X,tvOS,watchOS),我们将回退到上述向后兼容性功能

    4.x支持

    • iOS 7.0或更高版本
    • tvOS 9.0或更高版本
    • watchOS 2.0或更高版本
    • OS X 10.8或更高版本
    • Xcode 7.3或更高版本

    向后兼容性

    三、SDWebImage的使用

    安装方法

    // 必须
    pod ‘SDWebImage'
    // 可选 使用GIF
    pod 'SDWebImage/GIF’
    // 可选 使用WebP
    pod 'SDWebImage/WebP’
    

    使用

    #import <SDWebImage/UIImageView+WebCache.h>
    
    ...
    
    [imageView sd_setImageWithURL:[NSURL URLWithString:@"[http://www.domain.com/path/to/image.jpg](http://www.domain.com/path/to/image.jpg)"] placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
    

    四、解读SDWebImage UML 类图 和 流程图

    首先看一下UML图

    image.png image.png
    1. 我们便于调用的类别依赖于UIView+WebCache,UIView+WebCache依赖于SDWebImageManager;
    2. SDWebImageManager 由 SDWebImageManagerDelegate、SDImageCache、SDWebImageDownloader 组成,聚合关系但不是强依赖;
    3. SDWebImageManager 依赖于 SDWebImageCombinedOperation,SDWebImageCombinedOperation实现了SDWebImageOperation的代理;
    4. SDImageCache 由 SDImageCacheConfig 组成,依赖 SDWebImageCodersManager;
    5. SDWebImageDownloader 依赖 SDWebImageDownloaderOperation、SDWebImageDownloadToken、SDWebImageCodersManager;
    6. SDWebImageCodersManager 由 SDWebImageWebPCoder、SDWebImageImageIOCoder、SDWebImageGIFCoder组成;
    7. SDWebImageCodersManager、SDWebImageGIFCoder 实现了 SDWebImageCoder 的代理,SDWebImageWebPCoder、SDWebImageImageIOCoder 实现了 SDWebImageCoder 的子类 SDWebImageProgressiveCoder 的代理;
    8. SDWebImageDownloaderOperation 继承于 NSOperation ,并实现了SDWebImageDownloaderOperationInterface 、SDWebImageOperation的代理;
    9. SDWebImagePrefetcher 由SDWebImageManager 和 SDWebImagePrefetcherDelegate 组成;
    10. SDWebImage 声明了 6个 Delegate。

    在文件中的位置:


    image.png

    流程图:


    image.png

    从流程图上看,

    1. 通常我们使用 UIImageView+WebCache 里的方法来设置网络图片的;
    2. UIImageView+WebCache 的主要方法是调用 UIView+WebCache 里的方法;
    3. UIView+WebCache 负责给 UIImageView 设置图片,
      ** 通过 SDWebImageManager 加载到图片,
      ** 把得到的 image 设置给 UIImageView
    4. SDWebImageManager 沟通 SDImageCache 和 SDWebImageDownloader ,
      ** 首先通过 SDImageCache 查询到是否有缓存的图片;
      ** 接着如果需要下载,就通过 SDWebImageDownloader 下载图片;
      ** 然后如果需要缓存,把图片缓存给 SDImageCache ;

    下一章,五、详细的类的解析和该类的流程

    相关文章

      网友评论

      本文标题:SDWebImage 4.x版本源码分析(一)图解!!!

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