2016技术笔记

2016笔记——SDWebImage

2018-07-27  本文已影响0人  满庭花醉三千客

之前觉得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。

加油~

上一篇下一篇

猜你喜欢

热点阅读