SD5.0

SD 5.0

SD 的整体分类如下所示:

分类 说明
Manager 管理控制类
Downloader 核心下载
Cache 缓存处理
Decoder 编码解码
Prefetcher 图片预下载
Transformer 图片转换
ImageView 动态图片
Utils 通用方法类
Categories 类目
WebCache Categories UIKiti 相关类目
Private 私有方法
Mapkit 地图相关类目

各层级主要调用流程和对应的主要方法如下图所示:

缓存模块

SD的缓存,主要有以下文件组成

有两大类型缓存:内存缓存(SDMemoryCache)和磁盘缓存(SDDiskCache)。

1. SDMemoryCache

SDMemoryCache 继承于 NSCache,且实现了SDMemoryCache协议

SDMemoryCache 协议需要实现的协议方法如下:

方法 说明
initWithConfig: 初始化配置基本信息
objectForKey: 通过key查询数据
setObject:forkey: 存储数据
removeObjectForKey: 通过key移除指定数据
removeAllObjects 移除所有数据

2. SDDiskCache

SDDiskCache 继承于 NSObject,且实现了 SDDiskCache 协议

SDDiskCache 协议具体实现的协议方法如下:

方法 说明
initWithConfig: 初始化配置基本信息
containsDataForKey: 是否包含该key的数据
dataForKey: 通过key查询数据
setData:forkey: 设置缓存数据
removeDataForKey: 移除指定数据
removeAllData 移除所有数据
removeExpiredData 移除过期数据
cachePathForKey: 通过key查询缓存路径
totalCount 缓存数据总数
totalSize 缓存数据总大小

3. SDImageCacheConfig

缓存信息配置文件,下面是该文件中部分参数字段说明:

参数 说明
shouldDisableiCloud 是否禁用iCloud(默认YES)
shouldCacheImagesInMemory 是否使用内存缓存(默认YES)
shouldUseWeakMemoryCache 图像的弱内存缓存控制(默认YES)
shouldRemoveExpiredDataWhenEnterBackground 应用程序进入后台时删除过期的磁盘数据(默认YES)
diskCacheReadingOptions 磁盘数据读配置,枚举类型默认0
diskCacheWritingOptions 磁盘数据写配置,枚举类型默认0
maxDiskAge 磁盘缓存时间(单位s),默认1week
maxDiskSize 磁盘缓存大小,默认0无限制
maxMemoryCost 内存缓存大小,默认0无限制
maxMemoryCount 内存缓存图片数量,默认0无限制
diskCacheExpireType 磁盘缓存过期类型,枚举类型(AccessDate和ModificationDate)默认ModificationDate
memoryCacheClass 自定义内存缓存类。该类实例必须实现“SDMemoryCache”协议。
diskCacheClass 自定义磁盘缓存类。该类实例必须实现“SDDiskCache”协议。

4. SDImageCacheDefine

该文件主要包含:

  1. 缓存的枚举类型和相关的block定义

    1
    2
    3
    4
    5
    6
    typedef NS_ENUM(NSInteger, SDImageCacheType) {
    SDImageCacheTypeNone, // 不使用缓存
    SDImageCacheTypeDisk, // 磁盘缓存
    SDImageCacheTypeMemory, // 内存缓存
    SDImageCacheTypeAll // 磁盘和内存缓存
    };
  2. 缓存图片查询过程中的解码方法 SDImageCacheDecodeImageData

  3. 定义了SDImageCache协议 和该协议必须实现的方法

方法 方法说明
queryImageForKey:options:context:completion: 通过key查询图片,通过返回ope,取消异步查询
storeImage:imageData:forKey:cacheType: completion: 以key为键存储图片
removeImageForKey:cacheType:completion: 移除指定key的图片
containsImageForKey:cacheType:completion: 是否包含key的键值图片
clearWithCacheType: completion: 清除图片缓存

5. SDImageCache

缓存的核心类,管理内存缓存和磁盘缓存,

实现了 SDImageCacheDefine 中的 SDImageCache 协议。

并提供以下方法

方法 方法说明
initWithNamespace: 初始化缓存方法
cachePathForKey: 通过key获取磁盘缓存的路径
storeImage:forkey:completion: 异步方法,图片/图片数据存储到磁盘、内存
storeImageToMemory:forkey: 同步方法,图片存储到内存
storeImageDataToDisk:forkey: 同步方法,图片数据存储到磁盘
diskImageExistsWithKey:completion 异步方法,图片在磁盘中是否存在
diskImageDataExistsWithKey: 同步方法,图片数据在磁盘中是否存在
diskImageDataForKey: 同步方法,使用串行队列查询图片数据
queryCacheOperationForKey:done: 异步查询方法,返回一个ope对象用于控制查询操作
imageFromMemoryCacheForKey: 同步方法,通过key从内存中查询缓存图片
imageFromDiskCacheForKey: 同步方法,通过key从磁盘中查询缓存图片
imageFromCacheForKey: 同步方法,通过key先从内存中查询缓存图片,如果没找到在从磁盘中查
removeImageForKey:withCompletion 异步方法,通过可以删除缓存
clearMemory 同步方法,清除内存缓存
clearDiskOnCompletion: 异步方法,清除磁盘缓存
deleteOldFilesWithCompletionBlock: 异步方法,清除过期磁盘缓存图片
totalDiskSize 获取磁盘缓存大小
totalDiskCount 获取磁盘缓存数量
calculateSizeWithCompletionBlock: 异步方法获取磁盘缓存数量和大小

6. SDImageCachesManager

管理缓存队列操作的优先级、串行、并行设置

该类 实现 SDImageCacheDefine 中的 SDImageCache 协议。

通过以下枚举类型控制执行策略

1
2
3
4
5
6
typedef NS_ENUM(NSUInteger, SDImageCachesManagerOperationPolicy) {
SDImageCachesManagerOperationPolicySerial,//串行执行
SDImageCachesManagerOperationPolicyConcurrent,//并行执行
SDImageCachesManagerOperationPolicyHighestOnly,//只执行优先级最高的缓存
SDImageCachesManagerOperationPolicyLowestOnly //只执行优先级最低的缓存
};

可以分别单独设置协议中的查询、存储、删除、是否包含和清除。

下载模块

SD的下载模块由以下文件组成

1. SDImageLoader

定义了SDImageLoader协议 和该协议需要实现的两个方法

方法 简介
canLoadWithURL: 判断该图片是否可以继续下载
loadImageWithURL:options:context:progress:completed: 获取图片数据

定义了图片解码方法:

SDImageLoaderDecodeImageData

SDImageLoaderDecodeProgressiveImageData

2. SDImageLoadersManager

图片加载管理类 实现了SDImageLoader协议 并且定义了添加和移除loaders管理方法

3. SDWebImageDownloaderConfig

图片下载选项配置类

  1. 图片下载执行顺序,枚举类型
1
2
3
4
typedef NS_ENUM(NSInteger, SDWebImageDownloaderExecutionOrder) {
SDWebImageDownloaderFIFOExecutionOrder,//先进先出
SDWebImageDownloaderLIFOExecutionOrder//后进先出
};
  1. 基本配置项
属性 说明
maxConcurrentDownloads 最大并发数量,默认6
downloadTimeout 下载超时时间,默认15s
minimumProgressInterval 下载进度回调最小间隔,默认0
sessionConfiguration 默认defaultSessionConfiguration
operationClass 默认SDWebImageDownloaderOperation
executionOrder 默认FIFOExecutionOrder 先进先出
urlCredential 设置url的证书默认为空
username 设置请求的用户名默认为空
password 设置请求的密码默认为空

4. SDWebImageDownloaderRequestModifier

该类首先定义了SDWebImageDownloaderRequestModifier协议 和该协议需要实现的方法

modifiedRequestWithRequest: 使用该协议可以便捷的修改请求器。

5. SDWebImageDownloader

一: 该类首先定义了与每个下载相关联的下载令牌 SDWebImageDownloadToken,该类需要实现 SDWebImageOperation 协议 方法,并且提供了取消下载的方法 cancel 和部分下载相关的只读属性:下载地址、下载请求和下载响应。

二: 下载的核心部分

定义了以下相关公有方法:

方法 说明
initWithConfig: 初始化并配置下载器(SDWebImageDownloaderConfig)
setValue:forHTTPHeaderField 设置下载请求头
valueForHTTPHeaderField: 获取下载请求头
downloadImageWithURL:options:progress:completed 创建一个下载实列,返回一个下载令牌(SDWebImageDownloadToken)
cancelAllDownloads 取消所有下载
invalidateSessionAndCancel 可选择的取消挂起的操作

三: 该类需要实现了 SDImageLoader 协议

四: 内部主要私用方法

|callCacheProcessForOperation:| 调用多线程查询缓存图片|
|callDownloadProcessForOperation:| 调用多线程下载图片|
|callStoreCacheProcessForOperation:| 调用多线程存储图片|

6. SDWebImageDownloaderOperation

该类继承 NSOperation 类,并定义和需要实现 SDWebImageDownloaderOperation 协议

SDWebImageDownloaderOperation协议有如下方法和属性:

一: 必须实现的方法/属性:

方法/属性 说明
initWithRequest:inSession:options 初始化下载对象
initWithRequest:inSession:options:options 初始化下载对象
addHandlersForProgress:completed 下载进度和完成处理程序,返回token用于取消该回调
cancel: 通过token取消下载
request(属性) 下载请求体
response(属性) 下载响应体

一: 可选择实现的属性:

属性 说明
dataTask NSURLSessionTask
credential NSURLCredential
minimumProgressInterval 下载过程中进度回调的百分比最小间隔设置,默认是0立即回调

下载管理

SD下载和缓存管理模块由以下文件组成

SDWebImageManager

该类默认初始化缓存管理 SDImageCache 和 下载器 SDWebImageDownloader,我们也可以修改成自定义下载类和缓存类,只要该类实现指定的协议方法。

SDWebImageManager 提供了以下方法和属性

属性 说明
delegate 代理
imageCache 查询图片缓存
imageLoader 加载图片
transformer 图像转换器,用于图像加载完成后的图像转换,并将转换后的图像存储到换存
cacheKeyFilter 缓存过滤器用于将url转换为缓存建
cacheSerializer 默认把源下载的数据存储的磁盘缓存
running 线程是否在执行
defaultImageCache 默认的图片缓存
defaultImageLoader 默认的图片加载
sharedManager 单例
方法 说明
initWithCache:loader 初始化默认的缓存管理器和图片加载器
loadImageWithURL:options:progress:completed 图片加载
loadImageWithURL:options:context:progress:completed 图片加载
cancelAll 取消所有下载队列
cacheKeyForURL 通过url获取缓存的key

loadImageWithURL: 核心图片加载方法内容主要实现逻辑如下所示:

代码部分请参考sd源码