SDWebImage 5.0简介

article/2025/10/8 2:12:02

一、 SDWebImage原理简介

1.结构 (设计思路借鉴:提供多种接口,到底层调用到同一个方法,减少调用方对可选参数的传递)

UIImageView+WebCache和UIButton+WebCache直接为表层的 UIKit框架提供接口,

SDWebImageManger(SDWebImageManager是SDWebImage的核心类,也是我们经常接触到的类)负责处理和协调SDWebImageDownloader和SDWebImageCache, 并与UIKit层进行交互。SDWebImageDownloaderOperation真正执行下载请求;

SDWebImageManger详解:https://www.jianshu.com/p/246f6303cb6f

最底层的两个类为高层抽象提供支持。

SDWebImageCompat 是最基础的配置文件,为了兼容苹果各个平台

SDWebImageCompat 详解:https://www.jianshu.com/p/cfdd59d7df7c

SDWebImageDecoder sd解码图片这个类其实是UIImage的一个分类UIImage+ForceDecode,主要用来解码UIImage

SDWebImageDecoder 详解: https://www.jianshu.com/p/e631b4b2a214

结构关系图

 

结构详图(类图)

 

2.原理

 

      一张图片加载的全过程:

 

  • 我们在使用SDWebImage时调用了[imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"]];这个简单的分类方法,然后就静静的等着图片被设置到UIImageView类对象上。
  • 经过一系列调用,我们首先来到UIView+WebCache分类中,在这个分类中,首先保障了图片加载的唯一性,然后就开始了核心的加载操作。
  • 接着就进入了SDWebImageManager类中,在这个类中,首先去查找是否有缓存,没有缓存的话才去服务器下载。
  • 想要查找缓存我们要进入SDImageCache这个类中,在这个类中,首先去内存中查看是否有对应的缓存,如果没有再去硬盘中查找是否有对应的缓存,但是从硬盘中获取的是图片的数据,要想获得图片还要经历解码、缩放和解压。当然如果都没有缓存的话就去下载。
  • 负责下载的是SDWebImageDownloader这个类,在这个类中,将图片的下载操作封装成了自定义的一个类SDWebImageDownloaderOperation,然后添加到了操作队列中。
  • 当操作队列调用这个操作时,会调用操作对象的- (void)start方法,在重写的这个方法中,生成了任务对象dataTask,并调用resume开始执行任务。
  • 因为SDWebImageDownloaderOperation类遵守了dataTask对象的协议,所以dataTask执行的结果会通过代理方法进行回调。在代理方法中,获取并保存了服务器返回的数据,并在任务执行结束后,对数据进行解码、缩放和解压。处理完成后就进行回调。
  • 通过重重回调,要回调的数据沿着SDWebImageDownloaderOperation->SDWebImageDownloader->SDWebImageManager->UIView+WebCache一路流动,其中流动到SDWebImageManager中时对图片进行了缓存,最后在UIView+WebCache中为UIImageView设置了处理好的图片。
  • 这就是SDWebImage加载图片的大体流程,当然还有非常多的小细节和小功能,这些就在以后对具体类的阅读中学习了。

 

运行时序图

运行流程图

3.源码解读(详解可看其中相关链接)

详解:https://juejin.im/post/5adff5636fb9a07aa213026b

二、SDWebImage4.0、5.0对比

 

4.0源码解析 :https://juejin.im/post/5bbec080e51d450e4d3021c0 

 

5.0源码解析:https://www.jianshu.com/p/8af8fc7cd5bc  

1.项目中结构(还是一样的,不像网上资料说的 变更了结构)

2.文件对比 5.0比4.0多出 61个文件(114+2-55)

 

3.SDAnimated 4.0只是为了处理GIF 5.0可以处理动画

 

 

 

4.Cache 充分体现SRP(单一职责)开发原则 ,缓存处理更加完备 专门的磁盘缓存处理类 内存缓存处理类

SDImageCache是SDWebImage的缓存类,是SDWebImage的重要组成部分,主要提供图片的缓存,和提取,分为内存缓存和磁盘缓存两种,因为SDWebImage的接口性设计,SDImageCache完全可以单独拿出来使用

详解:https://www.jianshu.com/p/f8f724bb0f4b

 

5.Coder(图片编解码器) 方法命名少了Web 

SDWebImage里自己写了一个编解码管理器,用于实现编码,解码,压缩,缩小图片像素功能。涉及到的文件有SDWebImageCodersManager,SDWebImageCoder,SDWebImageImageIOCoder等等

详解 :https://www.jianshu.com/p/615d3178a508

 

6.Loader 图片下载 充分体现SRP(单一职责)开发原则,区分更加明显 类的功能更加单一 ,SDWebImageError 4.0没有 5.0专门的错误处理

SDWebImageDownloader和SDWebImageDownloaderOperation 是 SDWebImage的下载类,是SDWebImage的很重要的一个类,这个类主要负责图片的下载

详解:https://www.jianshu.com/p/a77fd7b09bd1

 

7.应用层 (多了4个文件,但跟实际使用没有多大关系)

/**

 UIImage category for image metadata, including animation, loop count, format, incremental, etc.

 */

用于图像元数据的ui图像类别,包括动画、循环计数、格式、增量等

@interface UIImage (Metadata)

 

/**

 Provide some commen method for `UIImage`.

 Image process is based on Core Graphics and vImage.

 */

@interface UIImage (Transform)

为“uiimage”提供一些通用方法,拉伸,裁剪,圆角等等。

图像处理基于Core Graphics 和 vImage

 

 

8.引入SDWebImageContext / SDWebImageMutableContext


可以看到SDWebImageContext / SDWebImageMutableContext 其实就是

以 SDWebImageContextOption为key、id(指定类型或者协议)为value 的NSDictionary/NSMutableDictionary

typedef NSDictionary<SDWebImageContextOption, id> SDWebImageContext;

typedef NSMutableDictionary<SDWebImageContextOption, id>SDWebImageMutableContext;

而 SDWebImageContextOption 是一个可扩展的String枚举

typedef NSString * SDWebImageContextOption NS_EXTENSIBLE_STRING_ENUM;

 

 

SDWebImage定义了10个SDWebImageContextOption的key、对应的value类型和定义的位置

 

Key

Value

Define

SDWebImageContextSetImageOperationKey

NSString

SDWebImageDefine.m

SDWebImageContextCustomManager

SDWebImageManager

SDWebImageDefine.m

SDWebImageContextImageTransformer

id<SDImageTransformer>

SDWebImageDefine.m

SDWebImageContextImageScaleFactor

CGFloat

SDWebImageDefine.m

SDWebImageContextStoreCacheType

SDImageCacheType

SDWebImageDefine.m

SDWebImageContextDownloadRequestModifier

id<SDWebImageDownloaderRequestModifier>

SDWebImageDefine.m

SDWebImageContextCacheKeyFilter

id<SDWebImageCacheKeyFilter>

SDWebImageDefine.m

SDWebImageContextCacheSerializer

id<SDWebImageCacheSerializer>

SDWebImageDefine.m

SDWebImageContextLoaderCachedImage

UIImage/NSImage<SDAnimatedImage>

SDImageLoader.m

 

通过图片看下SDWebImageContext有多重要

从上图可以看到,SDWebImageContext就像一条「流水线」,把里面的参数项从最外层的View层一直传递到SDImageCache和SDWebImageDownloaderOperation。「流水线」经过的各个模块会从上去各自取自己感兴趣的东西使用(彩色实心箭头)

详解:https://www.jianshu.com/p/cfde8db5c051

9.协议化了很多重要的对象。(灵活)

之前要做某个操作必须用该对象 现在任何对象都可以 只要遵守了协议就可以

配合新引入的 SDWebImageContext/SDWebImageMutableContext 参数,保留快速使用特性的同时可以灵活的自定义高级功能

 

4.4

5.0

SDWebImageCacheSerializerBlock

id<SDWebImageCacheSerializer>

SDWebImageCacheKeyFilterBlock

id<SDWebImageCacheKeyFilter>

SDWebImageDownloader

id<SDImageLoader>

SDImageCache

id<SDImageCache>

SDWebImageDownloaderProgressBlock

id<SDWebImageIndicator>

 

详解:https://www.jianshu.com/p/cfde8db5c051

10.UIImage+GIF 方法变更

 

备注:

1.NS_EXTENSIBLE_STRING_ENUM 字符串类型枚举

转载于:https://www.cnblogs.com/lijianyi/p/11576988.html


http://chatgpt.dhexx.cn/article/Rk5VV0Ep.shtml

相关文章

SDWebImage的主流程

SDWebImage提供了UIImageView的分类来实现从网络端下载数据并缓存到内存和磁盘。非常的流行,现在就主流程分析下. 主要的学习链接 &#xff1a;SDWebImage源码解读 - 简书 SDWebImage有如下特点&#xff1a; 提供了UIImageView和UIButton的分类。以支持加载网络图片并缓存…

SDWebImage的缓存策略

SDWebImage 相信对大多数开发者来说&#xff0c;都是一个不陌生的名字。它除了帮助我们读取网络图片&#xff0c;还会处理这些图片的缓存。它的缓存机制到底是什么样的呢&#xff0c;让我给跟大家唠叨唠叨&#xff0c;希望你能有收获。 基本结构 闲言少叙&#xff0c;咱们这就…

SDWebImage源码解析

这段时间研究了一下SDWebImage源码&#xff0c;因个人能力有限&#xff0c;如有不对的地方&#xff0c;请指出或留言&#xff0c;谢谢&#xff01; SDWebImage是一个开源的第三方库&#xff0c;它提供了UIImageView的一个分类&#xff0c;以支持从远程服务器下载并缓存图片的功…

【iOS】SDWebImage

文章目录 SDWebImage日常使用一些主要功能获取图片缓存 缓存机制独立的异步图像下载独立的异步图像缓存 图片加载全过程 源码分析架构图结构SDWebImageManager1. SDWebImageOptions2. SDWebImageManagerDelegate SDWebImageCompatSDWebImageCompat.hSDWebImageCompat.m sd_imag…

开源框架:SDWebImage

引言: SDWebImage是我搞iOS以来少数佩服的框架,膜拜一下作者.真的写的非常棒! 这套开源框架还是蛮重要的, 涉及到异步加载图片源和自动缓存. 我们如果能够熟练使用其API 就可以实现很多复杂的需求了. 作者依旧在更新,目前3.0 版本已经非常强大! 简化了更多的API接口.加强了…

iOS 第三方框架-SDWebImage解读

在iOS的图片加载框架中&#xff0c;SDWebImage可谓是占据大半壁江山。它支持从网络中下载且缓存图片&#xff0c;并设置图片到对应的UIImageView控件或者UIButton控件。在项目中使用SDWebImage来管理图片加载相关操作可以极大地提高开发效率&#xff0c;让我们更加专注于业务逻…

iOS——SDWebImage解读

前言 在iOS的图片加载框架中&#xff0c;SDWebImage占据了大半壁江山。它提供了UIImageView的一个分类&#xff0c;支持从网络中下载且缓存图片&#xff0c;并设置图片到对应的UIImageView控件或者UIButton控件。在项目中使用SDWebImage来管理图片加载相关操作可以极大地提高开…

SDWebImage异步加载图片及缓存的管理与清理

一、SDWebImage介绍 1、在项目的开发过程中&#xff0c;我们经常会用到异步加载图片的功能&#xff0c;先从网络上异步下载图片&#xff0c;然后通过UIImageView显示在屏幕上。这是一个经常使用的功能&#xff0c;基本上所有的联网应用程序都要用到的功能&#xff0c;现在GitH…

iOS SDWebImage详细介绍

在iOS的图片加载框架中&#xff0c;SDWebImage使用频率非常高。它支持从网络中下载且缓存图片&#xff0c;并设置图片到对应的UIImageView控件或者UIButton控件。在项目中使用SDWebImage来管理图片加载相关操作可以极大地提高开发效率&#xff0c;让我们更加专注于业务逻辑实现…

JNA入门

1&#xff0c;什么是JNA&#xff1f; JNA全称Java Native Access&#xff0c;是一个建立在JNI技术之上的Java开源框架。 2&#xff0c;JNA有什么用&#xff1f; Java开发过程中&#xff0c;有时候会需要和C&#xff0c;C等交互&#xff0c;JNA相当于中间的适配器 3&#xf…

JNA —— Java调用C/C++动态库

工作所需&#xff0c;要使用Java调用c/c的动态库&#xff0c;实现Java程序使用动态库中的函数。 搜索了一番&#xff0c;常用的有JNI、JNA方法。 JNI&#xff08;Java Native Interface&#xff09; JNI定义了一种公用的语法&#xff0c;当Java和c/c都遵循这样的语法时就可以互…

关于JAVA中的JNA

1、jna是什么 jna是java native access的简称&#xff0c;用他可以调用C、C代码&#xff0c;特别是windows中强大的库文件&#xff08;dll&#xff0c;在linux下是so文件&#xff09;&#xff0c;这样java就可以操控底层的一些东西&#xff0c;比如调用加密机、智能卡之类的 2、…

JNA与JNI谁更受青睐呢

JNA(Java Native Access)框架是一个开源的Java框架&#xff0c;是SUN公司主导开发的&#xff0c;建立在经典的JNI的基础之上的一个框架。非常强大、易用。其中JNA是对JNI的封装&#xff0c;能让java使用者更好的使用本地的动态库 一、JNA与JNI的比较 JNI: JNI允许Java代码和其…

JNA实战系列:第一个简单的JNA开发程序

文章目录 第一个简单的JNA的开发程序一、引入依赖包二、创建一个接口&#xff0c;继承Libary类三、在Java中使用dll中封装的方法总结:JNA中调用C、CDLL或者.so库中的函数的步骤总结:思考 第一个简单的JNA的开发程序 假如有一个helloworld.h和一个helloworld.dll文件&#xff0…

Java通过JNA调用so库 Linux环境

记录一下自己的JNA调研成果&#xff0c;需求是公司同事用C写了一个红外测温SDK&#xff0c;编译成so文件后提供给客户使用。客户需要一个Linux环境用Java调用so库的一个demo&#xff0c;刚好就我一个懂点Java&#xff0c;所有有了这次调研。 因为JNA相关资料实在太少&#xff…

JNI便捷开发框架JNA框架之入门(一)

一、JNA介绍 JNA(Java Native Access)框架是一个开源的Java框架&#xff0c;是SUN公司主导开发的&#xff0c;建立在经典的JNI的基础之上的一个框架。它提供一组Java工具类用于在运行期动态访问系统本地共享类库而不需要编写任何Native/JNI代码。开发人员只要在一个java接口中…

JNA简介

2019独角兽企业重金招聘Python工程师标准>>> JNA JNA&#xff08;Java Native Access &#xff09;提供一组Java工具类用于在运行期动态访问系统本地库&#xff08;native library&#xff1a;如Window的dll&#xff09;而不需要编写任何Native/JNI代码。开发人员只…

JNA的概念

1. JNA简单介绍 先说JNI(Java Native Interface)吧&#xff0c;有过不同语言间通信经历的一般都知道&#xff0c;它允许Java代码和其他语言&#xff08;尤其C/C&#xff09;写的代码进行交互&#xff0c;只要遵守调用约定即可。首先看下JNI调用C/C的过程&#xff0c;注意写程序…

Java 之 JNA(调用第三方库)

是什么&#xff1f; 一、了解JNA之前&#xff0c;我们先了解一下JNA的前身JNI&#xff08;Java Native Interface&#xff09;&#xff1a;通过使用 Java本地接口书写程序&#xff0c;可以确保代码在不同的平台上方便移植。 [1] 从Java1.1开始&#xff0c;JNI标准成为java平台…

JNA实战笔记汇总(一)—— JNA简介及demo环境创建

目录 1、简介 2、原理 3、配置环境&#xff0c;创建demo 3.1 搞清楚.dll/.so文件适用环境 3.2 创建一个普通的maven项目 3.2.1 将.dll/.so文件放在resources根路径下 3.2.2 pom.xml文件添加jna依赖 3.2.3 编写一个CLibrary接口&#xff0c;继承Library接口 3.2.4 编写…