SDWebImage Source Probe: Manager

402 查看

 在 SDWebImage Source Probe: WebCache 一文中,通过最常用的 sd_setImageWithURL 方法,来分析源码。而在其中,对于图片的 download 方法,也是需要理解的重点之一。它用于处理异步下载和图片缓存的类,当然也可直接拿来使用。SDWebImageManager 这个类,为 WebCacheSDWebImageDownloaderSDImageCache 搭建了一个桥梁,使得拥有更好的协同性。而每个类负责的功能不同,又是通过该类进行了结构上的解耦。

这篇通过分析 SDWebImageManager 的 Source Code ,来深入分析一下 SD 三方库中,对于 download 方法具体实现细节。

缓存策略一览

在 WebCache 的 sd_setImageWithURL 方法中的缓存策略,调用了这个方法:

参数解释:

  • url:image 对应的 url
  • options:缓存策略枚举
  • progress:在 download 过程中的动作,block 实现
  • completed:在 download 完成后的动作,block 实现

在查看方法之前,先来查看一下缓存策略枚举(options)是如何定义的,在源码中作者已经在注释里描述了每一种枚举代表的含义,这里笔者翻译了一下:

Manage Download Image 主要流程

了解了所有的下载策略,开始阅读实现的源码。

首先,先考虑到了传递参数 url 类型为 NSString 的情况,在注释中,作者这样写道:

没有传递 NSURL ,而是使用 NSString 对象传递 url 是一个很常见的错误。由于一些奇怪的原因,Xcode 并不会抛出类型不匹配的警告。所以,我们于此允许传递 NSString 对象,并自动转换成 NSURL 从而保护该错误。

仍是为了防止参数类型错误,对 url 的类型再次进行了判断。如果非法,则赋 nil 方便后面的排查。

当 url 合法性过滤过程完成后,发现了源码中会实例化 SDWebImageCombinedOperation 这么一个对象。这是继承与 NSObject 并遵循 SDWebImageOperation 协议的一个类。

SDWebImageCombinedOperation