iOS源代码分析——SDWebImage
主要作用:异步加载图片并且提供缓存机制。
主要用到的类别: SDWebImage+WebCache
主要用到的方法: [self.imageView sd_setImageWithURL: placeholderImage:]
核心方法: [self.imageView sd_setImageWithURL:
placeHolderImage:
options:
progress:
completed:]
加载选项options(共13个,这里只列出常用的)
默认加载选项:
SDWebImageRetryFailed(保证不会多次尝试访问一个失效或者错误的URL)
SDWebImageLowPriority (当scriollview滑动时 图片不会被加载)
可选选项
SDWebImageCacheMemoryOnly (不支持磁盘缓存,只有内存缓存)
SDWebImageProgressiveDownload (渐进式下载)
SDWebImageRefreshCached (当一个URL对应的图片改变了,会更新缓存)
加载流程:
1.[self sd_cancelCurrentImageLoad]
保证当前没有正在进行的异步下载操作,不会与即将进行的操作发生冲突
2.设置占位符
if (!(options & SDWebImageDelayPlaceholder)) {
self.image = placeholder;
}
如果传入的 options 中没有 SDWebImageDelayPlaceholder(默认情况下 options == 0), 那么就会为 UIImageView 添加一个临时的 image, 也就是占位图.
3.获取图片
判断传入的URL是否为空,如果为空做异常处理。如果非空一个全局的单例SDWebImageManager 就会调用以下方法
[SDWebImageManager.sharedManager
downloadImageWithURL:
options:
progress:
completed:]
SDWebImageManage是UIImageView+WebCache 和 SDWebImageDownloader, SDImageCache 之间构建一个桥梁 起到协调工作的作用。
具体源码实现:
首先判断URL是否被正确传入。传入的NSString类型被转换为NSURL,如果转换失败那么URL被赋值为空,这个下载操作就会出错,做异常处理。
如果传入的URL正确,那么会调用[self cacheKeyForURL:url]方法找到key再调 用operation.cacheOperation=[self.imageCache queryCacheOperationForKey:key done:^(UIImage *cachedImage, NSData *cachedData, SDImageCacheType cacheType) {} 在缓存中查找以前是否下载过相同的图片。如果下载过拿到image赋值给imageview,如果没有就调用SDWebImageDownloader的实例方法id <SDWebImageOperation> subOperation = [self.imageDownloader downloadImageWithURL:url
options:downloaderOptions
progress:progressBlock
completed:^(UIImage *downloadedImage, NSData *data, NSError *error, BOOL finished) { ... }];
如果返回正确的downloadedImage赋值给imageview,并且调用SDWebImageCache的实例方法[self.imageCache storeImage:downloadedImage
recalculateFromImage:NO
imageData:data
forKey:key
toDisk:cacheOnDisk];
来存储这个图片数据。