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
该文件主要包含:
缓存的枚举类型和相关的block定义
1
2
3
4
5
6typedef NS_ENUM(NSInteger, SDImageCacheType) {
SDImageCacheTypeNone, // 不使用缓存
SDImageCacheTypeDisk, // 磁盘缓存
SDImageCacheTypeMemory, // 内存缓存
SDImageCacheTypeAll // 磁盘和内存缓存
};缓存图片查询过程中的解码方法 SDImageCacheDecodeImageData
定义了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 | typedef NS_ENUM(NSUInteger, SDImageCachesManagerOperationPolicy) { |
可以分别单独设置协议中的查询、存储、删除、是否包含和清除。
下载模块
SD的下载模块由以下文件组成
1. SDImageLoader
定义了SDImageLoader协议 和该协议需要实现的两个方法
方法 | 简介 |
---|---|
canLoadWithURL: | 判断该图片是否可以继续下载 |
loadImageWithURL:options:context:progress:completed: | 获取图片数据 |
定义了图片解码方法:
SDImageLoaderDecodeImageData
SDImageLoaderDecodeProgressiveImageData
2. SDImageLoadersManager
图片加载管理类 实现了SDImageLoader协议 并且定义了添加和移除loaders管理方法
3. SDWebImageDownloaderConfig
图片下载选项配置类
- 图片下载执行顺序,枚举类型
1
2
3
4
typedef NS_ENUM(NSInteger, SDWebImageDownloaderExecutionOrder) {
SDWebImageDownloaderFIFOExecutionOrder,//先进先出
SDWebImageDownloaderLIFOExecutionOrder//后进先出
};
- 基本配置项
属性 | 说明 |
---|---|
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源码。