遇见你之前,我只有眼前的苟且,遇见你之后,才有了诗和远方。
话不多说,我们最熟悉的
sd_setImageWithURL:placeholderImage:
或sd_setImageWithURL:placeholderImage:options:
,会先把placeholderImage
显示,然后SDWebImageManager
根据URL处理图片。进入
SDWebImageManager-downloadWithURL:options:progress:completed:
,交给SDImageCache
从缓存查找图片是否已经下载queryDiskCacheForKey:done:
先从内存图片缓存查找是否有图片,源码:
UIImage *image = [self imageFromMemoryCacheForKey:key];
if (image) {
doneBlock(image, SDImageCacheTypeMemory);
return nil;
}
如果内存中已经有图片缓存,SDImageCache
回调 SDWebImageQueryCompletedBlock()
到 SDWebImageManager
。
SDWebImageCompletionBlock
回调SDWebImageCompletionWithFinishedBlock
到UIImageView+WebCache
等前端展示图片。如果内存缓存中没有,开启异步线程从硬盘查找图片是否已经缓存。根据 URLKey 在硬盘缓存目录下尝试读取图片文件。源码:
@autoreleasepool {
UIImage *diskImage = [self diskImageForKey:key];
if (diskImage && self.shouldCacheImagesInMemory) {
NSUInteger cost = SDCacheCostForImage(diskImage);
[self.memCache setObject:diskImage forKey:key cost:cost];
}
dispatch_async(dispatch_get_main_queue(), ^{
doneBlock(diskImage, SDImageCacheTypeDisk);
});
}
如果上一操作从硬盘读取到了图片,将图片添加到内存缓存中(如果空闲内存过小,会先清空内存缓存)。SDImageCache
回调 SDWebImageQueryCompletedBlock
,进而回调展示图片。
如果从硬盘缓存目录读取不到图片,说明所有缓存都不存在该图片,需要下载图片,重新生成一个下载器
SDWebImageDownloader
开始下载图片。图片下载由
NSMutableURLRequest
来做,实现相关block来判断图片下载中、下载完成和下载失败。至于下载后图片如何处理,解码等并未研究,一旦图片解码完成,相关block回调,得到downloadedImage,回调给需要的地方展示图片。将图片保存到 SDImageCache 中,内存缓存和硬盘缓存同时保存。
SDImageCache
在初始化的时候会注册一些消息通知,在内存警告或退到后台的时候清理内存图片缓存,应用结束的时候清理过期图片。
10.缓存大小与清除
NSInteger size = [[SDImageCache sharedImageCache] getSize];
[[SDImageCache sharedImageCache] clearDiskOnCompletion:^{
NSLog(@"清除成功");
}];