iOS 第三方框架-SDWebImage解读

article/2025/10/7 11:06:56

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

SDWebImage 概论

  1. 提供了一个UIImageView的category用来加载网络图片并且对网络图片的缓存进行管理
  2. 采用异步方式来下载网络图片
  3. 采用异步方式,使用memory+disk来缓存网络图片,自动管理缓存。
  4. 支持GIF动画
  5. 支持WebP格式
  6. 同一个URL的网络图片不会被重复下载
  7. 失效的URL不会被无限重试
  8. 耗时操作都在子线程,确保不会阻塞主线程
  9. 使用GCD和ARC
  10. 支持Arm64

SDWebImage 使用

1.使用IImageView+WebCache category来加载UITableView中cell的图片

[cell.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"] placeholderImage:[UIImage imageNamed:@"placeholder.png"]];

2.使用Blocks,采用这个方案可以在网络图片加载过程中得知图片的下载进度和图片加载成功与否

[cell.imageView sd_setImageWithURL:[NSURL 
URLWithString:@"http://www.domain.com/path/to/image.jpg"] 
placeholderImage:[UIImage imageNamed:@"placeholder.png"] 
completed:^(UIImage image, NSError error, SDImageCacheType cacheType, NSURL *imageURL) { 
... completion code here ... 
}];

3.使用SDWebImageManager,SDWebImageManager为UIImageView+WebCache category的实现提供接口。

SDWebImageManager manager = [SDWebImageManager sharedManager] ;[manager downloadImageWithURL:imageURL options:0 progress:^(NSInteger   receivedSize, NSInteger expectedSize) { 
// progression tracking code 
}completed:^(UIImage image, NSError error, SDImageCacheType cacheType,   BOOL finished, NSURL imageURL) {if (image) { // do something with image } }];

4.加载图片还有使用SDWebImageDownloader和SDImageCache方式,但那个并不是我们经常用到的。基本上面所讲的3个方法都能满足需求。

SDWebImage 流程

UIImageView的图片加载流程

SDWebImage 接口

SDWebImage是一个成熟而且比较庞大的框架,但是在使用过程中并不需要太多的接口,这算是一种代码封装程度的体现。这里就介绍比较常用的几个接口。

1.给UIImageView设置图片的接口,SDWebImage有提供多个给UIImageView设置图片的接口,最终所有的接口都会调用下图的这个接口,这是大多数框架的做法。

image

给UIImageView设置图片的接口

2.获取SDWebImage的磁盘缓存大小,在项目中有时候会需要统计应用的磁盘缓存内容大小,那么获取图片的缓存大小就是使用这个接口来实现

[SDImageCache sharedImageCache] getSize];

3.清理内存缓存,清理内存中缓存的图片资源,释放内存资源。

[[SDImageCache sharedImageCache] clearMemory];

4.有了清理内存缓存,自然也有清理磁盘缓存的接口

[[SDImageCache sharedImageCache] clearDisk];

SDWebImage 解析

解析主要围绕着SDWebImage的图片加载流程来分析,介绍SDWebImage这个框架加载图片过程中的一些处理方法和设计思路。

1.给UIImageView设置图片,然后SDWebImage调用这个最终的图片加载方法。

给UIImageView设置图片:
给UIImageView设置图片

2.开始加载之前图片先取消对应的UIImageView先前的图片下载操作。试想,如果我们给UIImageView设置了一张新的图片,那么我们还会在意该UIImageVIew先前是要加载哪一张图片么?应该是不在意的吧!那是不是应该尝试把该UIImageView先前的加载图片相关操作给取消掉呢。

 [self sd_cancelCurrentImageLoad]

取消对应的UIImageView先前的图片下载操作:

image

该方法经过周转,最后调用了以下方法,框架将图片对应的下载操作放到UIView的一个自定义字典属性(operationDictionary)中,取消下载操作第一步也是从这个UIView的自定义字典属性(operationDictionary)中取出所有的下载操作,然后依次调用取消方法,最后将取消的操作从(operationDictionary)字典属性中移除。

最终的取消下载方法:

image

3.移除之前没用的图片下载操作之后就创建一个新的图片下载操作,然后设置到UIView的一个自定义字典属性(operationDictionary)中。

创建一个新的图片下载操作:

image

4.看看如何创建一个新的图片下载操作,框架保存了一个失效的URL列表,如果URL失效了就会被加入这个列表,保证不会重复多次请求失效的URL。

图片下载操作:

image

根据给定的URL生成一个唯一的Key,之后利用这个key到缓存中查找对应的图片缓存。

查找图片缓存:

image

5.读取图片缓存,根据key先从内存中读取图片缓存,若没有命中内存缓存则读取磁盘缓存,如果磁盘缓存命中,那么将磁盘缓存读到内存中成为内存缓存。如果都没有命中缓存的话,那么就在执行的doneBlock中开始下载图片。

读取图片缓存:

6.图片下载操作完成后会将图片对应的数据通过completed Block进行回调

图片下载操作:

image

在图片下载方法中,调用了一个方法用于添加创建和下载过程中的各类Block回调。

图片下载方法:

image

添加该URL加载过程的状态回调Block

状态回调Block:

image

如果该URL是第一次加载的话,那么就会执行createCallback这个回调Block,然后在createCallback里面开始构建网络请求,在下载过程中执行各类进度Block回调。

构建网络请求:

image

7.当图片下载完成之后会回到done的Block回调中做图片转换处理和缓存操作

图片转换处理和缓存操作:

image

回到UIImageView控件的设置图片方法Block回调中,给对应的UIImageView设置图片,操作流程到此完成。

Block中设置图片:

image

总结

SDWebImage作为一个优秀的图片加载框架,提供的使用方法和接口对开发者来说非常友好。其内部实现多是采用Block的方式来实现回调,代码阅读起来可能没有那么直观。此文章旨在给大家讲解SDWebImage这个框架的图片大概加载流程,其中具体细节限于篇幅无法详细深究。

SDWebImage在加载图片网络请求的NSURLConnection的代理中对httpCode 做了判断,当httpCode为304的时候放弃下载,读取缓存。


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

相关文章

iOS——SDWebImage解读

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

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

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

iOS SDWebImage详细介绍

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

JNA入门

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

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

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

关于JAVA中的JNA

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

JNA与JNI谁更受青睐呢

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

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

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

Java通过JNA调用so库 Linux环境

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

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

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

JNA简介

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

JNA的概念

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

Java 之 JNA(调用第三方库)

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

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

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

ROW(行)与COLUMN(列)

数列数,COLUMNS(A:B)2,即A到B一共两列。

column函数HTML5,column函数 excel中column函数的使用方法

column函数是一种查询的工具,我相信许多人都不会使用到这一个函数,因此在实际工程当中并不是十分的常见,然而这一款韩束如果能够掌握,对我们的工作也是非常有帮助的,接下来我们就一起来好好的了解一下这个函数究竟该如何使用。 column函数——column函数的使用方法 1.colu…

Duplicate column name ‘xxx_column‘

错误场景: 使用MyBatisPlus分页查询的情况下列名重复(注:select查询不报错, 映射正常) 例如 → select id, name, name from user 解决方法: 列名重复,删除重复的列名, 保证留一个就可以了 错误原因: 根据错误定位到PaginationInterceptor的queryTotal方法 最终…

mysql插入报错:colum xxx cannot be null

测试同学催促我赶紧解决上面的问题,首先看了下数据库这个字段确实是必填的,默认是当前时间 可是看了下代码发现mybatis的sql语句插入的时候包含了这个operate_time字段 那么讲道理必需给实体对象的operateTime字段赋值才行,可线上代码明明没有…

Vue template中函数获取el-table-colum中的属性值

方案如下&#xff1a; <el-table-column prop"id" label"操作"><template slot-scope"scope"><istyle"margin: 0 10px; cursor: pointer"click"clickItemInfo(scope.$index, scope.row,scope.column,scope.row.i…

hbase架构原理之region、memstore、hfile、hlog、columm-family、colum、cell

**鄙人的新书《elasticsearch7完全开发指南》&#xff0c;欢迎订阅&#xff01;** ----- https://wenku.baidu.com/view/8ff2ce94591b6bd97f192279168884868762b8e7 **《kibana权威指南》** ---- https://wenku.baidu.com/view/24cfee1ce43a580216fc700abb68a98270feac21 Hbas…