相关文章推荐
爽快的哑铃  ·  镜舟,连接大数据与价值·  1 月前    · 
考研的猕猴桃  ·  ICC Anti-corruption ...·  9 月前    · 
深沉的火柴  ·  QUESTION: New ...·  11 月前    · 
谈吐大方的长颈鹿  ·  携程酒店-苏州金鸡湖博览中心亚朵酒店预订-苏 ...·  11 月前    · 
老实的稀饭  ·  外媒:有马方调查员称机长系唯一嫌犯 | 南方周末·  1 年前    · 
Code  ›  SDWebImage源码解读(一)开发者社区
解压 源码 sdwebimage
https://cloud.tencent.com/developer/article/1174787
踢足球的筷子
2 年前
作者头像
honey缘木鱼
0 篇文章

SDWebImage源码解读(一)

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > 娱乐心理测试 > SDWebImage源码解读(一)

SDWebImage源码解读(一)

作者头像
honey缘木鱼
发布 于 2018-08-02 15:13:17
433 0
发布 于 2018-08-02 15:13:17
举报

SDWebImage 是目前最流行、使用最广泛的第三方图片处理框架,它不仅能够异步加载网络图片,还提供了一套图片缓存管理机制(内存缓存+磁盘缓存),功能非常强大。

SD内部已经帮我们把请求回来的数据或者缓存到本地的图片资源都进行了异步解压缩,因此不需要我们来做。 图片压缩流程:

假设我们使用 +imageWithContentsOfFile: 方法从磁盘中加载一张图片,这个时候的图片并没有解压缩;
然后将生成的 UIImage 赋值给 UIImageView ;
接着一个隐式的 CATransaction 捕获到了 UIImageView 图层树的变化;
在主线程的下一个 run loop 到来时,Core Animation 提交了这个隐式的 transaction ,这个过程可能会对图片进行 copy 操作,而受图片是否字节对齐等因素的影响,这个 copy 操作可能会涉及以下部分或全部步骤:
分配内存缓冲区用于管理文件 IO 和解压缩操作;
将文件数据从磁盘读到内存中;
将压缩的图片数据解码成未压缩的位图形式,这是一个非常耗时的 CPU 操作;
最后 Core Animation 使用未压缩的位图数据渲染 UIImageView 的图层。

解压缩是一个非常耗时的 CPU 操作,并且它默认是在主线程中执行的。那么当需要加载的图片比较多时,就会对我们应用的响应性造成严重的影响,尤其是在快速滑动的列表上,就会特别的卡顿。为什么要解压呢?因为当你进行图片渲染的时候,必须得到解压缩后的原始像素数据,才能进行图形渲染,这就是解压缩的原因。SD在SDWebImageDecoder这个文件中进行了强制解压缩,我们赋值给imageView的时候已经是解压缩的文件了,因此不会卡主主线程,不然默认是在主线程进行解压缩,图片一多,卡爆了。

1.SD的所有类的作用简单介绍

NSData+ImageContentType  通过Image data判断当前图片的格式
SDImageCache  缓存  定义了 Disk  和  memory二级缓存(NSCache)负责管理cache  单例
SDWebImageCompat  保证不同平台/版本/屏幕等兼容性的宏定义和内联 图片缩放
SDWebImageDecoder  图片解压缩,内部只有一个接口
SDWebImageDownloader 异步图片下载管理,管理下载队列,管理operation 管理网络请求 处理结果和异常  单例
存放网络请求回调的block  自己理解的数据结构大概是
//  结构{"url":[{"progress":"progressBlock"},{"complete":"completeBlock"}]}
SDWebImageDownloaderOperation 实现了异步下载图片的NSOperation,网络请求给予NSURLSession 代理下载
自定义的Operation任务对象,需要手动实现start cancel等方法
SDWebImageManager  核心管理类 主要对缓存管理 + 下载管理进行了封装  主要接口downloadImageWithURL单利
SDWebImageOperation   operation协议  只定义了cancel operation这一接口 上面的downloaderOperation的代理
SDWebImagePrefetcher 低优先级情况下预先下载图片,对SDWebImageViewManager进行简单封装 很少用
MKAnnotationView+WebCache – 为MKAnnotationView异步加载图片
UIButton+WebCache  为UIButton异步加载图片
UIImage+GIF  将Image data转换成指定格式图片
UIImage+MultiFormat 将image data转换成指定格式图片
 
推荐文章
爽快的哑铃  ·  镜舟,连接大数据与价值
1 月前
考研的猕猴桃  ·  ICC Anti-corruption Third Party Due Diligence: A Guide for Small- and Medium-sized Enterprises - ICC
9 月前
深沉的火柴  ·  QUESTION: New STABILITY errors after build upload! - Android - Solar2D Game Engine
11 月前
谈吐大方的长颈鹿  ·  携程酒店-苏州金鸡湖博览中心亚朵酒店预订-苏州金鸡湖博览中心亚朵酒店价格、点评、电话、地址查询-【携程旅行手机版】
11 月前
老实的稀饭  ·  外媒:有马方调查员称机长系唯一嫌犯 | 南方周末
1 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号