最近帮忙经理面试了一些iOS开发,当问到是否看过SDWebImage源码时,都说看过。但是当问到具体实现时几乎都答错了,于是就有了写这篇文章的想法。
这里主要SDWebImage的UIImageView的类别,因为这也是使用最多的。核心方法是
- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock
这个方法首先会在内存cache(一个nscache的集合)里面查找,如果没有查找到再去disk里面查找,如果都查找不到就去下载。其实sd默认还为使用者做了一个操作,就是将下载下来或者disk读取到的图片数据解码,因为直接得到的是编码压缩后的图片数据,不是位图,要把它们渲染到屏幕前就需要进行解码转成位图数据。
下面是解码方法:
image = [UIImage decodedImageWithImage:scaledImage];
//解析操作SDWebImageDecoder类的
+ (UIImage *)decodedImageWithImage:(UIImage *)image {
所以cache里默认存储的是位图,位图体积大所以也是一种空间换时间的操作。