我相信在开发过程中,大家都会用到这个框架,在GitHub上排名仅仅低于AFNetworking.这也是大多数开发者对这个框架的认同,也表明这个框架的牛逼之处,今天我们就仔细了解他的一些使用地方和这个框架的底层怎么实现的.这次我们先谈谈SDWebImage实现原理,然后再带大家看看日常怎么使用.
1.SDWebImage的内部结构
为什么要这样说了,也不是没有依据的,这是GitHub上的链接,大家可以自己下载下来. github.com/rs/SDWebImage
然后通过整理,里面主要就三大块.
主要就一个缓存类,一个下载类,还有就是用到分类. 因为SDWebImageDownloader本身没有下载功能,所以图片下载是DownloadOperation这个分类执行.
下面简单的说说这个方法背后的原理:
1.显示placeholderImage
2.SDImageCache从缓存中查找图片是否已经下载
3.先从内存图片缓存查找是否有图片
4.如果内存中有图片缓存,显示图片
5.如果内存中没有,生成NSInvocationOperation添加到执行队列开始从硬盘查找图片缓存
6.如果硬盘中有,将图片添加到内存缓存中(如果空闲内存过小,会先清空内存缓存),显示图片
7.如果硬盘中没有,说明该图片没有缓存,需要下载图片,共享或重新生成一个下载器SDWebImageDownLoader开始下载图片
8.开始图片网络请求,下载数据
9.数据下载完成后交给SDWebImageDecoder做图片解码
10.回调展示图片
11.图片保存到硬盘缓存和内存缓存
12.SDImageCache初始化会注册一些通知,在内存警告或退到后台的时候清理内存图片缓存,应用结束的时候清理过期图片
是不是感觉到了它逻辑的严密性和资源的最大化利用?是的,这就是为什么SDWebImage如此成功的一个原因。
2.SDWebImage的使用
//1.下载图片且需要获取下载进度
//内存缓存&磁盘缓存
-(void)download
{
[self.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://img4.duitang.com/uploads/blog/201310/18/20131018213446_smUw4.thumb.600_0.jpeg"] placeholderImage:[UIImage imageNamed:@"Snip20160221_306"] options:SDWebImageCacheMemoryOnly | SDWebImageProgressiveDownload progress:^(NSInteger receivedSize, NSInteger expectedSize) {
} completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
switch (cacheType) {
case SDImageCacheTypeNone:
NSLog(@"直接下载");
break;
case SDImageCacheTypeDisk:
NSLog(@"磁盘缓存");
break;
case SDImageCacheTypeMemory:
NSLog(@"内存缓存");
break;
default:
break;
}
}];
NSLog(@"%@",[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]);
}
第一个参数:要下载图片的url地址
第二个参数:设置该imageView的占位图片
第三个参数:传一个枚举值,告诉程序你下载图片的策略是什么
第一个block块:获取当前图片数据的下载进度
receivedSize:已经下载完成的数据大小
expectedSize:该文件的数据总大小
第二个block块:当图片下载完成之后执行该block中的代码
image:下载得到的图片数据
error:下载出现的错误信息
SDImageCacheType:图片的缓存策略(不缓存,内存缓存,沙盒缓存)
imageURL:下载的图片的url地址
03系统级内存警告如何处理(面试)
//取消当前正在进行的所有下载操作
[[SDWebImageManager sharedManager] cancelAll];//清除缓存数据(面试)//cleanDisk:删除过期的文件数据,计算当前未过期的已经下载的文件数据的大小,如果发现该数据大小大于我们设置的最大缓存数据大小,那么程序内部会按照按文件数据缓存的时间从远到近删除,知道小于最大缓存数据为止。//clearMemory:直接删除文件,重新创建新的文件夹//[[SDWebImageManager sharedManager].imageCache cleanDisk];[[SDWebImageManager sharedManager].imageCacheclearMemory];
04SDWebImage 默认的缓存时间是1周
05如何播放gif图片/*
5-1 把用户传入的gif图片->NSData
5-2 根据该Data创建一个图片数据源(NSData->CFImageSourceRef)
5-3 计算该数据源中一共有多少帧,把每一帧数据取出来放到图片数组中
5-4 根据得到的数组+计算的动画时间-》可动画的image
[UIImage animatedImageWithImages:images duration:duration];
*/06如何判断当前图片类型,只判断图片二进制数据的第一个字节 + (NSString*)sd_contentTypeForImageData:(NSData*)data;
07内部如何进行缓存处理?使用了NSCache类,使用和NSDictionary类似
08沙盒缓存图片的命名方式为对该图片的URL进行MD5加密 echo -n"url"|MD5
09当接收到内存警告之后,内部会自动清理内存缓存
10图片的下载顺序,默认是先进先出的
附上一个比较好的基础文档,blog.csdn.net/indulgein/article/details/51130812
其实SDWebimage 底层是通过runtime的只是,其实我们只要知道这些基础只是就够用了,其他也不是太了解,等我后期再深入了解再过来补充一下.