zoukankan      html  css  js  c++  java
  • SDWebImage库结构的简单分析

    SDWebImage库的作用:

    通过对UIImageView的类别扩展来实现异步加载替换图片的工作。


    主要用到的对象:
    1、UIImageView (WebCache)类别,入口封装,实现读取图片完成后的回调
    2、SDWebImageManager,对图片进行管理的中转站,记录那些图片正在读取。
         向下层读取Cache(调用SDImageCache),或者向网络读取对象(调用SDWebImageDownloader) 。
         实现SDImageCache和SDWebImageDownloader的回调。
    3、SDImageCache,根据URL的MD5摘要对图片进行存储和读取(实现存在内存中或者存在硬盘上两种实现)
         实现图片和内存清理工作。
    4、SDWebImageDownloader,根据URL向网络读取数据(实现部分读取和全部读取后再通知回调两种方式)

    其他类:
    SDWebImageDecoder,异步对图像进行了一次解压⋯⋯
    目前不明白为什么要做这么道工序。(现在清楚了,功能解释见下文)


    有趣的点:
    1、SDImageCache是怎么做数据管理的?
    SDImageCache分两个部分,一个是内存层面的,一个是硬盘层面的。
    内存层面的相当是个缓存器,以Key-Value的形式存储图片。当内存不够的时候会清除所有缓存图片。
    用搜索文件系统的方式做管理,文件替换方式是以时间为单位,剔除时间大于一周的图片文件。
    当SDWebImageManager向SDImageCache要资源时,先搜索内存层面的数据,如果有直接返回,没有的话去访问磁盘,将图片从磁盘读取出来,然后做Decoder,将图片对象放到内存层面做备份,再返回调用层。

    2、为啥必须做Decoder?
    通过这个博客:http://www.cocoanetics.com/2011/10/avoiding-image-decompression-sickness/
    现在明白了,由于UIImage的imageWithData函数是每次画图的时候才将Data解压成ARGB的图像,
    所以在每次画图的时候,会有一个解压操作,这样效率很低,但是只有瞬时的内存需求。
    为了提高效率通过SDWebImageDecoder将包装在Data下的资源解压,然后画在另外一张图片上,这样这张新图片就不再需要重复解压了。
    这种做法是典型的空间换时间的做法。
  • 相关阅读:
    IQuerable与IEnumable的区别
    idea2021.1新功能
    intellij idea2021快捷键大全
    解决报错:The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone.
    spring boot中不能识别RestController的原因
    Maven的安装与配置
    关于window10安装jdk,配置环境变量,javac不是内部或外部命令,也不是可运行的程序 或批处理文件的细节问题。
    记录日常工作经验,技术解决问题分享格式
    Brt课程设计day14
    Brt课程设计day13
  • 原文地址:https://www.cnblogs.com/biosli/p/2602624.html
Copyright © 2011-2022 走看看