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下的资源解压,然后画在另外一张图片上,这样这张新图片就不再需要重复解压了。
    这种做法是典型的空间换时间的做法。
  • 相关阅读:
    AutoFac中常用方法说明
    DI之循环依赖
    NB/T 10215-2019 风力发电机组 测风传感器等最新能源行业标准
    DL/T 691-2019等最新电力行业标准
    TSG D7006-2020 压力管道监督检验规则
    YY/T 0595-2020 医疗器械 质量管理体系YY/T 0287-2017 应用指南
    GB/T 38775-2020系列电动汽车无线充电系统标准
    最新电动汽车安全标准
    GB 38032-2020 电动客车安全要求
    GB 38031-2020 电动汽车用动力蓄电池安全要求
  • 原文地址:https://www.cnblogs.com/biosli/p/2602624.html
Copyright © 2011-2022 走看看