遇见你之前,我只有眼前的苟且,遇见你之后,才有了诗和远方。
话不多说,我们最熟悉的
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(@"清除成功");
}];