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

article/2025/10/8 4:24:03

一、SDWebImage介绍

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

  1. SDWebImage(提供异步加载图片、缓存管理,下载进度等,功能最齐全)
  2. EGOImageLoading(之前使用的框架,缓存管理不如SDWebImage设计简单)
  3. AFNetworking (只提供异步加载图片功能,无缓存管理)
这里主要介绍SDWebImage,这个框架用的最多,在GitHub上已经给出框架的一些使用方法(详情https://github.com/rs/SDWebImage),我们直接下载这个框架,运行里面的Demo发现Xcode会报编译错误,这是因为SDWebImage在项目中引用了GitHub的另外一个项目libwebp的项目,如果要运行Demo网上已经给出了解决办法。

2、我们只是使用异步加载图片及缓存管理的相关功能,不需要libwebp项目,新建项目,将SDWebImage目录下的源代码直接加到项目中




二、使用SDWebImage提供的类扩展实现异步加载图片

1、SDWebImage提供了UIImageView的扩展类,只需要在头文件中加入文件引用

#import "UIImageView+WebCache.h"


异步加载图片方法:

- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder;
  • url 图片的地址
  • placeholder   网络图片在尚未加载成功时显示的图像

默认情况下,SDWebImage会忽略Header中的缓存设置,将图片以url为key进行保存,url与图片是一一对应关系。所以请求同一个url时,SDWebImage会从缓存中取得图片。一般的情况下用此方法可以满足我们的应用要求,但是如果你请求同一个url,而这张图片在服务器端更新了,本地客户端再次请求时还是会返回缓存中的旧图片,例如加载头像类经常更新的图片时,就会出现头像不能更新的问题,由于url与图片一一对应,一种解决的办法是改变部分url地址方式实现更新,不过这种方法操作起来很复杂,下面介绍一个更方便的办法

- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options;

我们将第三个参数设置为SDWebImageRefreshCached就可以实现图片更新操作了,使用方法很简单,如下:

	NSURL *url = [NSURL URLWithString:@"http://www.example.com/image.png"];UIImage *defaultImage = [UIImage imageNamed:@"default.png"];[self.imageView setImageWithURL:url placeholderImage:defaultImage options:SDWebImageRefreshCached];

三、缓存的计算及清理

1、缓存计算,这里的缓存计算,只计算SDWebImage的缓存,沙盒文件夹中的其它文件并不包括在内:

   [SDWebImageManager.sharedManager.imageCache 
calculateSizeWithCompletionBlock:^(NSUInteger fileCount, NSUInteger totalSize) {}];


2、缓存清理

在SDWebImage中有两种缓存,一种是磁盘缓存,一种为内存缓存,框架都提供了相应的方法:

 [[[SDWebImageManager sharedManager] imageCache] clearDisk];[[[SDWebImageManager sharedManager] imageCache] clearMemory];


不过这里要特别注意一下,在IOS7中你会发现使用这两个方法缓存总清除不干净,即使断网下还是会有数据。这是因为在IOS7中,缓存机制做了修改,使用上述两个方法只清除了SDWebImage的缓存,没有清除系统的缓存,所以我们可以在清除缓存的代理中额外添加以下:

[[NSURLCache sharedURLCache] removeAllCachedResponses];





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

相关文章

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…

Row Column

Row Column 参考&#xff1a; Row classFlutter Layout Cheat SheetFlutter — Row/Column Cheat Sheet mainAxisAlignment和crossAxisAlignment 属性mainAxisAlignment和crossAxisAlignment mainAxisAlignment - 表示的是主轴的对齐方式crossAxisAlignment - 表示的是次轴…

Mybatis中resultMap的Colum和property属性

1&#xff1a; resultMap标签 当我们的数据库字段与实体类的属性不一致时&#xff0c;就需要使用该标签进行一一映射。 2&#xff1a;使用情况 2.1 简单查询 <resultMap id"这个resultMap的id" type"对应实体类的全限定类名"><id column"…