美文网首页2016技术笔记
2016笔记——SDWebImage

2016笔记——SDWebImage

作者: 满庭花醉三千客 | 来源:发表于2018-07-27 14:38 被阅读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。

    加油~

    相关文章

      网友评论

        本文标题:2016笔记——SDWebImage

        本文链接:https://www.haomeiwen.com/subject/caxgmftx.html