最全SDWebImage-3.8版本源码阅读详解
一、前言
SDWebImage,非常友好的网络图片加载第三方框架,在GitHub中已经获得了15000++的star,链接地址:https://github.com/rs/SDWebImage
本人分析源码比较喜欢使用Xmind思维导图,非常方便做流程记录。所以,下面直接给大家伙看思维导图。
二、SDWebImage 优缺点
2.1、纯属个人看法,优点可能不止这些,下面的有点个人觉得很值得学习。
2.2、缺点嘛,我就找到一个。。。。。。
三、SDWebImage工作流程
从下面的图可以很看出,高度高度解耦啊!!!!!!!全程采用block回调方式,爽!!!!
四、SDWebImage框架
SDWebImage整体来说,主要是围绕了3个单例来进行,分别是SDWebImageManager管理器、 SDWebImageDownloader下载器、 SDImageCache缓存器单例
4.1、分类入口
UIButton+WebCache
UIImageView+HighlightedWebCache
UIImageView+WebCache
UIButton和UIImageView,都是直接调用接口:- (void)sd_setImageWithURL:(NSURL *)url 负责传递URL
4.2、SDWebImageManager管理器单例
工作:负责管理图片获取和显示,协调SDImageCache缓存器和SDWebImageDownloader下载器工作。
4.2、SDWebImageDownloader下载器单例
工作:通过自定义NSOperation,进行网络图片下载,回调Manager 的block。高度解耦,精华多多,值得学习!!!!!!
4.3、SDImageCache 缓存器单例
工作:管理cache和disk图片增删查。
五、特别解惑
1、为啥下载和从disk中读取的图片需要做Decode??
由于UIImage的imageWithData函数是每次画图的时候才将Data解压成ARGB的图像,所以在每次画图的时候,会有一个解压操作,这样效率很低,但是只有瞬时的内存需求。为了提高效率通过SDWebImageDecoder将包装在Data下的资源解压,然后画在另外一张图片上,这样这张新图片就不再需要重复解压了。
这种做法是典型的空间换时间的做法。
2、SDImageCache是怎么做数据管理的?
SDImageCache分两个部分,一个是内存层面的,一个是硬盘层面的。内存层面是一个自定义大小的NSCache缓存器,以Key-Value的形式存储图片,当内存警告时时会清除所有缓存图片。用搜索文件系统的方式做管理,文件替换方式是以时间为单位,剔除时间大于一周的图片文件,文件的删除操作在进入后台或者退出程序是进行。当SDWebImageManager向SDImageCache要资源时,先搜索内存层面的数据,如果有直接返回,没有的话去访问磁盘,将图片从磁盘读取出来,然后做Decoder,将图片对象放到内存层面做备份,再返回调用层。
3、如何避免重复下载???
Downloader下载器单例维护NSOperationQueue管理当前所有下载操作,在下载之前,先遍历队列,比较operation id,如果正在下载,则不再下载,避免出现一个图片正在下载,但是未完成,通过operation id来判断,避免重复加入下载
最全SDWebImage-3.8版本源码阅读详解的更多相关文章
- spring各个版本源码
各版本源码下载地址 http://maven.springframework.org/release/org/springframework/spring/
- Spring各版本源码下载
spring framework 各版本源码下载地址 现在spring的源码下载地址真是不好找,这次终于找到了.记录一下,以帮助需要的朋友. https://github.com/spring-pro ...
- [转帖]nginx1.17.2版本源码安装
nginx1.17.2版本源码安装 原创: 沧海书生 Ansible爱好者 昨天 公众号里面的内容 这里简单测试了下 在x86的虚拟机里面编译安装 nginx 仅make make install n ...
- Kafka 0.10.1版本源码 Idea编译
Kafka 0.10.1版本源码 Idea编译 1.环境准备 Jdk 1.8 Scala 2.11.12:下载scala-2.11.12.msi并配置环境变量 Gradle 5.6.4: 下载Grad ...
- (3.4)mysql基础深入——mysql.server启动脚本源码阅读与分析
(3.4)mysql基础深入——mysql.server启动脚本源码阅读与分析 my.server主要分为3大部分 [1]变量初始化部分 [2]函数声明部分 [3]具体执行部分 #!/bin/sh # ...
- HTTP 状态响应码 意思详解/大全
HTTP 状态响应码 意思详解/大全 转:http://blog.csdn.net/helin916012530/article/details/29842595 HTTP状态码(HTTP Statu ...
- NopCommerce源码架构详解--初识高性能的开源商城系统cms
很多人都说通过阅读.学习大神们高质量的代码是提高自己技术能力最快的方式之一.我觉得通过阅读NopCommerce的源码,可以从中学习很多企业系统.软件开发的规范和一些新的技术.技巧,可以快速地提高我们 ...
- MySql绿色版配置及使用详解
原文:MySql绿色版配置及使用详解 最近在做项目开发时用到了MySql数据库,在看了一些有关MySql的文章后,很快就上手使用了.在使用的过程中还是出现了一些问题,因为使用的是绿色免安装版的MySq ...
- NopCommerce源码架构详解
NopCommerce源码架构详解--初识高性能的开源商城系统cms 很多人都说通过阅读.学习大神们高质量的代码是提高自己技术能力最快的方式之一.我觉得通过阅读NopCommerce的源码,可以从 ...
随机推荐
- 在python3.x上安装suds 并访问webservice
suds...py3很乱.. 一开始直接使用命令行:pip install suds安装,结果报错ImportError: No module named client,然后就自然的pip insta ...
- mysql与mongodb命令对比
连接:mysql: mysql -h localhost -u username -pmongodb:con = pymongo.Connection(‘localhost’,27017)显示数据库m ...
- Stacktack overview
class Lifecycle(models.Model): """The Lifecycle table is the Master for a group of ...
- array_merge函数的注意事项
array_merge — 合并一个或多个数组 array_merge() 将一个或多个数组的单元合并起来,一个数组中的值附加在前一个数组的后面.返回作为结果的数组 如果输入的数组中有相同的字符串键名 ...
- ActiveMQ 的客户端选项
本章重点 怎么使用独占式消费者 消息分组的威力 理解流和二进制大对象 容错传输 计划消息分发 简介 上一章我们介绍了 ActiveMQ 的代理特性,本章我们将学习 ActiveMQ 客户端的一些高级特 ...
- 180. Consecutive Numbers
问题描述 解决方案 select distinct l1.Num as ConsecutiveNums from Logs l1,Logs l2,Logs l3 where l1.Id+1=l2.Id ...
- db2还原离线备份文件报错SQL2071N 提示“访问共享库出现错误”解决
db2 buffers buffer 提示报错: SQL2071N An error occurred while accessing the shared library “/home/db2a ...
- abd 命令
adb全称Android Debug Bridge ,安卓调试桥接器.它是Android SDK里面的一个工具,用这个工具可以直接操作管理Android模拟器或者真实Android设备.adb的工作方 ...
- MySQL全文搜索
http://www.yiibai.com/mysql/full-text-search.html 在本节中,您将学习如何使用MySQL全文搜索功能. MySQL全文搜索提供了一种实现各种高级搜索技术 ...
- 使用NSUserDefaults保存自定义对象(转)
转自http://zani.iteye.com/blog/1431239 .h文件 #import <Foundation/Foundation.h> @interface MyObjec ...