2016笔记——SDWebImage
之前觉得SDWebImage很好用,可以直接下载下来,放到文件中,导入头文件“UIImageView+WebCache.h”即可使用。
屏幕快照 2016-05-25 17.15.40.png效果:
Simulator Screen Shot 2016年5月25日 17.16.00.png但是他究竟干了啥,之前并不知晓,今天好好研究研究:
1 ViewController:
调用sd_setImageWithURL:方法
2 UIImageView+WebCache:
调用sd_setImageWithURL:placeholderImage:options:progress:completed:方法
3 UIImageView+WebCache:
如果有placeholderImage,则显示。
4 UIImageView+WebCache:
判断URL是否存在,如果存在则把URL交给SDWebImageManager处理。
5 UIImageView+WebCache:
调用SDWebImageManager 的downloadImageWithURL:options:progress:completed:方法
completed参数是一个completedBlockA,可以回传图片、错误信息、缓存类型(无缓存,磁盘缓存,内存缓存)、是否完成、图片URL
6 SDWebImageManager:
判断URL是否为String类型,如果是,则转换为NSURL类型
7 SDWebImageManager:
判断URL是否为NSURL类型,防止为NSNULL类型,否则会导致程序崩溃
8 SDWebImageManager:
判断该URL是否失败过
9 SDWebImageManager:
如果URL长度为空,或者该URL失败过而且用户设置的类型不是SDWebImageRetryFailed,那么就返回错误信息
10 SDWebImageManager:
生成一个缓存该URL的key,如果用户设置了生成器,则使用用户的,如果没有设置,那么key就是该URL的字符串
11 SDWebImageManager:
将key交给SDImageCache,调用queryDiskCacheForKey:done:从缓存中查找图片。done参数是一个doneBlock,可以回传image和缓存类型,缓存中如果没有,则会去磁盘中查找。如果在SDImageCache中查找到了图片,则将图片利用doneBlock回传到SDWebImageManager,然后通过completeBlockA,将图片回传到前端展示图片。
12 SDWebImageManager:
如果在SDImageCache中没有查找到,则SDImageManager开始配置SDWebImageDownloaderOptions。
然后让共享的下载器SDWebImageDownloader执行downloadImageWithURL:options:progress:completed:方法。
该方法progress参数为progressBlock,要回传已接收的数据size和总的数据size;
completed参数completedBlock会回传图片、data、错误信息、是否完成这四个值。
在SDWebImageDownloader中将下载图片任务生成一个SDWebImageDownloaderOperation。
SDWebImageDownloaderOperation初始化方法为initWithRequest:options:progress:completed:cancelled:方法。
该方法共有3个Block:
progressBlock会回传接收到的size和总的size
completedBlock会回传图片、data、错误信息、是否完成这四个值
cancelledBlock无回传值
13 SDWebImageDownloader:
将operation添加到operationQueue中,然后队列就会执行这个operation了,之后会调用该operation的start方法,在SDWebImageDownloaderOperation的start方法中,构建NSURLConnection进行下载任务。
14 SDWebImageDownloaderOperation:
在NSURLConnection的代理方法中设置相应的Block回传值。
15 SDWebImageDownloaderOperation:
在connection:didReceiveData:方法中,利用ImageIO进行了按照图片下载进度加载效果。
16 SDWebImageDownloaderOperation:
在connectionDidFinishLoading:方法中,先取出imageData,用data生成图片,然后去查询网址,得知其是几倍图,然后进行分辨率处理。此时如果image.images为空,则交给SDWebImageDecoder做图片解码处理,调用decodedImageWithImage:方法。
17 SDWebImageDownloaderOperation:
解码完成后,将图片通过completedBlock传给SDWebImageDownloader,然后再通过completedBlock传给SDWebImageManager。
18 SDWebImageManager:
如果图片需要处理(比如旋转),则处理之。然后将图片存入内存缓存和磁盘缓存中。
19 SDWebImageManager:
将图片、缓存类型、是否完成、错误信息、URL通过completedBlockA传回到UIImageView+WebCache中,UIImageView对图片进行赋值。
好复杂吧?
懒人看图:
屏幕快照 2016-03-31 15.02.15.png除了缓存的回传,其他的都要使用Block回传信息。所以会有很多Block。
加油~