最佳图片处理框架SDWebImage的使用

SDWebImage内部实现及其原理 SDWebImage的知名度就不用说了,简单介绍一下,它是一个图片框架,支持从网络中下载且缓存图片,并设置图片到对应的UIImageView 控件或者 UIButton 控件。使用SDWebImage来管理图片加载,会极大地提高我们的开发效率,从而让我们更加专注于业务逻辑实现。也正是因为这样,让我们很多开发都只会用SDWebImage,而忽略了它的内部实现,今天我就给大家介绍一下SDWebImage的内部实现及原理。 一、SDWebImage 概述 SDWebImage是一个开源的第三方库,它提供了UII 阅读详情

第一步,下载SDWebImage,导入工程。github托管地址https://github.com/rs/SDWebImage

第二步,在需要的地方导入头文件

1
#import "UIImageView+WebCache.h"

第三步,调用sd_setImageWithURL:方法缓存图片,注意,这就是新版本的新方法,旧方法是setImageWithURL:。下面将几个方法都介绍一下。

1. sd_setImageWithURL:

1
2
//图片缓存的基本代码,就是这么简单
     [self.image1 sd_setImageWithURL:imagePath1];

2. sd_setImageWithURL:  completed:

1
2
3
4
5
6
//用block 可以在图片加载完成之后做些事情
     [self.image2 sd_setImageWithURL:imagePath2 completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
         
         NSLog(@ "这里可以在图片加载完成之后做些事情" );
         
     }];

3. sd_setImageWithURL:  placeholderImage:

1
2
//给一张默认图片,先使用默认图片,当图片加载完成后再替换
     [self.image1 sd_setImageWithURL:imagePath1 placeholderImage:[UIImage imageNamed:@ "default" ]];

4. sd_setImageWithURL:  placeholderImage:  completed:

1
2
3
4
5
6
//使用默认图片,而且用block 在完成后做一些事情
     [self.image1 sd_setImageWithURL:imagePath1 placeholderImage:[UIImage imageNamed:@ "default" ] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
         
         NSLog(@ "图片加载完成后做的事情" );
         
     }];

5. sd_setImageWithURL:  placeholderImage:  options:

1
2
3
//options 选择方式
     
     [self.image1 sd_setImageWithURL:imagePath1 placeholderImage:[UIImage imageNamed:@ "default" ] options:SDWebImageRetryFailed];

其他就不一一介绍了,oc是自文档语言,看方法名就知道干什么的了。除了带options选项的方法,其他的方法都是综合存储,也就是内存缓存和磁盘缓存结合的方式,如果你只需要内存缓存,那么在options这里选择SDWebImageCacheMemoryOnly就可以了。

如果不想深入了解,到这里你已经可以用SDWebimage进行图片缓存了,接下来我要解释options的所有选项,以及SDWebImage内部执行流程。

一、options所有选项:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
   //失败后重试
      SDWebImageRetryFailed = 1 << 0,
      
      //UI交互期间开始下载,导致延迟下载比如UIScrollView减速。
      SDWebImageLowPriority = 1 << 1,
      
      //只进行内存缓存
      SDWebImageCacheMemoryOnly = 1 << 2,
      
      //这个标志可以渐进式下载,显示的图像是逐步在下载
      SDWebImageProgressiveDownload = 1 << 3,
      
      //刷新缓存
      SDWebImageRefreshCached = 1 << 4,
      
      //后台下载
      SDWebImageContinueInBackground = 1 << 5,
      
      //NSMutableURLRequest.HTTPShouldHandleCookies = YES;
      
      SDWebImageHandleCookies = 1 << 6,
      
      //允许使用无效的SSL证书
      //SDWebImageAllowInvalidSSLCertificates = 1 << 7,
      
      //优先下载
      SDWebImageHighPriority = 1 << 8,
      
      //延迟占位符
      SDWebImageDelayPlaceholder = 1 << 9,
      
      //改变动画形象
      SDWebImageTransformAnimatedImage = 1 << 10,

二、SDWebImage内部实现过程

  1. 入口 setImageWithURL:placeholderImage:options: 会先把 placeholderImage 显示,然后 SDWebImageManager 根据 URL 开始处理图片。

  2. 进入 SDWebImageManager-downloadWithURL:delegate:options:userInfo:,交给 SDImageCache 从缓存查找图片是否已经下载 queryDiskCacheForKey:delegate:userInfo:.

  3. 先从内存图片缓存查找是否有图片,如果内存中已经有图片缓存,SDImageCacheDelegate 回调 imageCache:didFindImage:forKey:userInfo: 到 SDWebImageManager。

  4. SDWebImageManagerDelegate 回调 webImageManager:didFinishWithImage: 到 UIImageView+WebCache 等前端展示图片。

  5. 如果内存缓存中没有,生成 NSInvocationOperation 添加到队列开始从硬盘查找图片是否已经缓存。

  6. 根据 URLKey 在硬盘缓存目录下尝试读取图片文件。这一步是在 NSOperation 进行的操作,所以回主线程进行结果回调 notifyDelegate:。

  7. 如果上一操作从硬盘读取到了图片,将图片添加到内存缓存中(如果空闲内存过小,会先清空内存缓存)。SDImageCacheDelegate 回调 imageCache:didFindImage:forKey:userInfo:。进而回调展示图片。

  8. 如果从硬盘缓存目录读取不到图片,说明所有缓存都不存在该图片,需要下载图片,回调 imageCache:didNotFindImageForKey:userInfo:。

  9. 共享或重新生成一个下载器 SDWebImageDownloader 开始下载图片。

  10. 图片下载由 NSURLConnection 来做,实现相关 delegate 来判断图片下载中、下载完成和下载失败。

  11. connection:didReceiveData: 中利用 ImageIO 做了按图片下载进度加载效果。

  12. connectionDidFinishLoading: 数据下载完成后交给 SDWebImageDecoder 做图片解码处理。

  13. 图片解码处理在一个 NSOperationQueue 完成,不会拖慢主线程 UI。如果有需要对下载的图片进行二次处理,最好也在这里完成,效率会好很多。

  14. 在主线程 notifyDelegateOnMainThreadWithInfo: 宣告解码完成,imageDecoder:didFinishDecodingImage:userInfo: 回调给 SDWebImageDownloader。

  15. imageDownloader:didFinishWithImage: 回调给 SDWebImageManager 告知图片下载完成。

  16. 通知所有的 downloadDelegates 下载完成,回调给需要的地方展示图片。

  17. 将图片保存到 SDImageCache 中,内存缓存和硬盘缓存同时保存。写文件到硬盘也在以单独 NSInvocationOperation 完成,避免拖慢主线程。

  18. SDImageCache 在初始化的时候会注册一些消息通知,在内存警告或退到后台的时候清理内存图片缓存,应用结束的时候清理过期图片。

  19. SDWI 也提供了 UIButton+WebCache 和 MKAnnotationView+WebCache,方便使用。

  20. SDWebImagePrefetcher 可以预先下载图片,方便后续使用。

从上面流程可以看出,当你调用setImageWithURL:方法的时候,他会自动去给你干这么多事,当你需要在某一具体时刻做事情的时候,你可以覆盖这些方法。比如在下载某个图片的过程中要响应一个事件,就覆盖这个方法:

1
2
3
4
5
6
7
8
9
10
11
//覆盖方法,指哪打哪,这个方法是下载imagePath2的时候响应
     SDWebImageManager *manager = [SDWebImageManager sharedManager];
     
     [manager downloadImageWithURL:imagePath2 options:SDWebImageRetryFailed progress:^(NSInteger receivedSize, NSInteger expectedSize) {
         
         NSLog(@ "显示当前进度" );
         
     } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
         
         NSLog(@ "下载完成" );
     }];

对于初级来说,用sd_setImageWithURL:的若干个方法就可以实现很好的图片缓存。

Flutter 使用 cached_network_image 缓存图片,优化加载体验 在 App 中会经常遇到需要从后台拉取图片的场景,这一方面会给服务器带来网络带宽消耗,另一方面加载图片的等待过程也会影响用户体验。因此,往往会在 App 端对图片做缓存机制,以避免同一张图片反复发起请求。在 Flutter 中,cached_network_image 即提供了缓存网络图片功能,同时还提供了丰富的加载过程指示。 上一篇给列表增加下拉刷新和上滑加载更多功能,我们使用了列表,其中列表中有从网络下载图片。直接使用 Flutter 自带的 Image.network 下载图片一是无法缓存,二是体. 阅读详情

相关推荐

国产化办公新选择:在银河麒麟V10上部署ToDesk远程桌面

本文详细介绍了在国产操作系统银河麒麟V10上部署ToDesk远程桌面的完整指南。作为国产远程控制工具,ToDesk在连接速度、系统适配性和用户体验方面表现优异,特别适合国产化办公场景。文章包含X86和ARM架构的安装步骤、常见问题排查及性能优化技巧,帮助用户高效实现远程办公。

weixin_33742618的博客 231

最新版SDWebImage的使用

我之前写过一篇博客,介绍缓存处理的三种方式,其中最难,最麻烦,最占内存资源的还是图片缓存,最近做的项目有大量的图片处理,还是采用了SDWebImage来处理,但是发现之前封装好的代码报错了。研究发现,是我用了新版的SDWebImage,好多方法都变了。 现在把代码贴出来,供大家参考。尤其是新手,看完这篇博客,图片缓存so easy。最后有demo供大家下载,先学习。 第一步,下载SDW

专注移动开发 948

matlab 用m_map画地形水深图

clear,clc %投影 m_proj('albers equal-area','lat',[5 43],'long',[105 125],'rect','on'); %加载水深文件 [CS,CH]=m_etopo2('contourf',[-7000:500:3000],'edgecolor','none'); %绘制高分辨率陆地和海岸线 m_gshhs_h('patch',[0.1 0.9 ...

qq_44913577的博客 9511

flutter插件调用APP页面、使用原生aar,framework库

本套课程适用于有一定的iOS、Android、Flutter开发基础。学完本次课程,能够让大家对Flutter如何调用移动端原生页面有一个清晰的认识;在纯Flutter开发过程中遇到需要调用原生功能的时候,能够快速定制属于自己或者公司的私有插件- Plugin。课程一共氛围两部分:1、Flutter插件跟iOS的交互部分:包括调用iOS原生页面、如何使用iOS的framework二进制、bundle资源文件、依赖的cocoapods资源;2、Flutter插件跟安卓的交互部分:包括调用Android原生页面、如何接收原生页面的回调、如何使用aar文件、依赖的其他资源。最终能够帮助大家定制私有插件;提升工作技能。备注:课程中使用环境[✓] Flutter (Channel stable, 1.22.5, on macOS 11.0.1 20B29 darwin-arm, locale zh-Hans-CN) [!] Android toolchain - develop for Android devices (Android SDK version 30.0.3)    ! Some Android licenses not accepted.  To resolve this, run: flutter doctor --android-licenses[✓] Xcode - develop for iOS and macOS (Xcode 12.2)[!] Android Studio (version 4.1)[✓] IntelliJ IDEA Community Edition (version 2020.3)[✓] Connected device (1 available)  

数字设计实验:自动售货机

本文旨在介绍数字设计实验:自动售货机的设计思路和实现代码

2401_83740084的博客 2227

如何读懂CiteSpace图谱?科研小白必看的节点颜色/年轮/聚类解读手册

本文详细解析CiteSpace图谱的核心视觉元素,包括节点颜色、年轮和聚类标识,帮助科研人员准确解读数据分析结果。通过生物医学案例展示如何从图谱中识别关键文献和研究趋势,提供五步系统解读法和常见错误规避策略,助力科研小白快速掌握文献计量分析技巧。

weixin_29179311的博客 313

SDWebImage 加载图片流程

SDWebImage是老生常谈的三方,这篇博客算是一个笔记吧,记录下SDWebImage源码相关加载图片流程. 注1: 整体流程基于 SDWebImage 5.0.6 版本. 注2: 本文只对iOS执行流程进行分析.默认会去除 Mac开发的部分(带有 #if SD_UIKIT || SD_MAC). SDWebImage 整体流程 我们通过官方的这张图可以看出整体流程,我们主要通过分类方法的形式直接接触SDWebImage的执行流程. SDWebImage内部加载流程层级较多,所以我这里分为 对外..

得不到的永远是骚栋. 1863

DM-VIO论文精读:从‘延迟边缘化’到‘位姿图BA’,手把手拆解单目VIO性能超越双目的秘密

本文深入解析DM-VIO技术如何通过延迟边缘化和位姿图BA创新,解决单目视觉惯性里程计(VIO)的尺度不可观性问题,并在精度上超越传统双目系统。文章详细介绍了延迟边缘化的双因子图结构设计、位姿图BA的多级初始化策略,以及系统级优化带来的性能提升,为VIO研究与实践提供了重要参考。

weixin_30616969的博客 427

SDWebIcon设计系统:基于SDWebImage的图标方案

你是否还在为iOS应用中的图标加载性能问题烦恼?图标作为UI的重要组成部分,其加载效率直接影响用户体验。传统图标方案存在加载缓慢、缓存混乱、格式不兼容等问题。本文将介绍如何利用SDWebImage构建高效、灵活的图标设计系统,解决这些痛点。 读完本文,你将获得: - 基于SDWebImage的图标缓存策略 - 图标格式优化与自动转换方案 - 动态图标样式处理(圆角、Tint颜色等) - 图标预加...

gitblog_01031的博客 833

3D iToF深度分辨率测量

本文展示了RGB-D传感器在三维测量中的高精度表现。标靶深度图显示其具备清晰、低噪、无干扰的特性,点云数据完整度高且轮廓分明。该技术已成功应用于物流(体积测量误差<1%)、工业(高反光部件装配检测)和农业(果蔬成熟度分级)等领域,验证了其硬件和算法的可靠性,能够满足不同场景下的三维测量需求。

dream it possible 251

Python爬虫实战:使用最新技术抓取采购网招标公告信息

本文将详细介绍如何使用Python最新爬虫技术构建一个高效的采购网招标公告信息抓取系统。我们将从爬虫基础概念讲起,逐步深入到高级技巧,包括异步处理、反爬虫对策、数据解析与存储等,并提供完整的代码实现。本文旨在为读者提供一套完整的网络数据采集解决方案,适用于各类政府采购平台和商业招标网站。网络爬虫(Web Crawler)是一种自动抓取互联网信息的程序或脚本,它们按照一定的规则,自动地浏览万维网并提取所需数据。在现代商业环境中,爬虫技术广泛应用于价格监控、竞争情报收集、市场研究等领域。

2201_76125261的博客 1620

YYWebImage,SDWebImage和PINRemoteImage比较

YYWebImage,SDWebImage和PINRemoteImage比较 共同的特性 以类别 api 下载远程图片。 图片缓存 图片提前解码 其他 图片框架比较 图片后处理 根据下面的比较,可以看出图片后处理方面,PINRemoteImage > YYWebImage > SDWebImage YYWebImage: 支持不带标记的后处理。 /** ...

weixin_34236497的博客 138

IgH EtherCAT 从入门到精通:第 3 章 第一次运行 Hello EtherCAT

摘要:启动EtherCAT主站实践指南 本章详细介绍了如何配置和启动EtherCAT主站系统,主要内容包括: 配置文件详解:讲解/etc/ethercat.conf中的关键配置项,包括主网卡指定、冗余备份设置和网卡驱动选择。 启动流程:说明通过systemd服务和手动命令两种方式加载内核模块,重点介绍了ec_master和ec_generic模块的加载顺序及验证方法。 命令行工具:列举ethercat工具的常用命令,如查看主站状态、扫描从站设备、读取PDO/SDO数据等。 示例程序:简要介绍内核态示例min

从事嵌入式linux android驱动开发,拥有全栈能力 310

解决iOS图像加载卡顿:SDWebImage强制解码技术详解

你是否遇到过这样的情况:滑动列表时图片加载导致界面卡顿,或者动画播放时帧率突然下降?这些问题往往与图像的延迟解码(Lazy Decoding)有关。SDWebImage作为iOS开发中最流行的图片加载库,提供了强制解码(Force Decode)功能来解决这一痛点。本文将深入解析强制解码的原理、实现方式以及最佳实践,帮助你彻底消除图像加载带来的性能瓶颈。 ## 什么是强制解码? 强制解码是一种...

gitblog_00950的博客 760

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

UIImageView-BetterFace对比分析:与其他iOS图片处理库的性能评测

想要为你的iOS应用添加智能人脸识别和图片裁剪功能吗?UIImageView-BetterFace正是你需要的终极解决方案!这个强大的UIImageView分类库能够自动检测图片中的人脸,并智能地调整裁剪区域,确保人脸在缩略图中完美显示。对于社交媒体应用、相册应用或任何需要展示用户头像的应用来说,这是一个简单而有效的工具。 ## 🚀 UIImageView-BetterFace的核心功能与优势

gitblog_00837的博客 939

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

终极指南:gh_mirrors/mov/movies中的AFNetworking与SDWebImage最佳实践

在iOS开发中,网络请求和图片加载是核心功能模块。gh_mirrors/mov/movies项目通过AFNetworking处理网络通信,结合SDWebImage实现高效图片加载,为移动应用提供了稳定可靠的数据交互解决方案。本文将深入解析这两个库在项目中的最佳实践,帮助开发者快速掌握iOS网络与图片处理的精髓。 ## 🚀 AFNetworking:构建高效网络请求架构 AFNetworkin

gitblog_00547的博客 465

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

个人常用iOS第三方库

前言 第三方库是现在的程序员离不开的东西 不光是APP开发 基本上所有的商业项目 都会或多或少的使用到第三方库 Github上Star>100的开源库数量如下 可以看到JS以绝对的优势排名第一 一定程度上也说明了JS在这几年为什么发展得这么迅速 不会点JS都不好意思说自己是码农 不过现在JS圈的造轮子浪潮也是愈演愈烈了 自己不写个框架都不好意思打招呼 OC排名第四 相信这个排名还会上升 Sw

-此夜微凉 1434

第三方库和Xcode插件

第三方库是现在的程序员离不开的东西 不光是APP开发 基本上所有的商业项目 都会或多或少的使用到第三方库 Github上Star>100的开源库数量如下 可以看到JS以绝对的优势排名第一 一定程度上也说明了JS在这几年为什么发展得这么迅速 不会点JS都不好意思说自己是码农 不过现在JS圈的造轮子浪潮也是愈演愈烈了 自己不写个框架都不好意思打招呼 OC排名第四 相信这个排名还...

a50893061的博客 1081

KTPhotoBrowser使用指南

KTPhotoBrowser 是一个轻量级的照片浏览器库,专为 iPhone 和 iPod touch 设计,其外观和行为类似于 iPhone 上的 Photos 应用。该库允许开发者轻松集成类似系统照片查看的功能,提供流畅的用户体验。它支持显示本地图片,且通过数据源协议灵活地解耦了图片加载逻辑,便于集成网络图片加载库如 SDWebImage 进行异步加载和缓存。 ## 项目快速启动 要迅速上

gitblog_00070的博客 485

个人常用iOS第三方库以及XCode插件介绍

前言 第三方库是现在的程序员离不开的东西 不光是APP开发 基本上所有的商业项目 都会或多或少的使用到第三方库 Github上Star>100的开源库数量如下 可以看到JS以绝对的优势排名第一 一定程度上也说明了JS在这几年为什么发展得这么迅速 不会点JS都不...

chuangxie3049的博客 566

深入解析NXP LPC2468:ARM7工业MCU架构、外设实战与系统设计

微控制器(MCU)作为嵌入式系统的核心,其架构设计与外设集成能力直接决定了系统的性能与可靠性。ARM架构以其高效的内核和丰富的生态系统,成为工业控制领域的首选。理解MCU的总线结构、存储器映射和时钟电源管理,是进行稳定系统设计的基础。这些技术通过高效的DMA数据搬运、多通信接口协同以及精细的低功耗管理,为复杂的工业应用如数据采集、通信网关和设备控制提供了坚实的硬件支持。本文以NXP经典的LPC2468工业级MCU为例,深入剖析其基于ARM7TDMI-S内核的**AHB矩阵总线**和**双指令集**设计原理,

weixin_30906185的博客 329

SDWebImageSwiftUI多平台适配:一次代码实现iOS、macOS、tvOS、watchOS和visionOS全覆盖

SDWebImageSwiftUI是一个基于SDWebImage的SwiftUI图片加载与动画框架,能够帮助开发者轻松实现iOS、macOS、tvOS、watchOS和visionOS多平台的图片处理需求。通过一次代码编写,即可在所有苹果平台上实现高效的图片加载、缓存和动画效果,极大地简化了跨平台开发流程。 ## 多平台适配的核心优势 使用SDWebImageSwiftUI进行多平台开发,开发

gitblog_00016的博客 373

ZBrush 风格化角色自评量表实战:拆解 scenario-zbrush-stylized 的 critique rubric 与可测量验收门

本文以 [critique.md](https://link.gitcode.com/i/657fd6d2ac2cbdab98457ccbf0b5e0e9) 为骨架,讲清这套“自评量表(self-critique rubric)”如何把风格化角色、风格化头发与手办的三类验收标准,落到可执行的函数、像素指标与阈值上。读完后你能做到:为每个关卡写出可判定的通过条件、调用对应度量函数生成报告、区分“代码

gitblog_00372的博客 1073

iOS-WebP完整教程:从零开始实现iOS图片压缩与WebP格式转换

iOS-WebP是一款专为iOS平台打造的WebP图片格式编解码工具,能够帮助开发者轻松实现高效的图片压缩与格式转换功能。WebP作为Google推出的现代图像格式,相比传统的JPEG和PNG格式,能够在保持相同图像质量的前提下显著减小文件大小,从而提升App加载速度和节省用户流量。本教程将带你从零开始,快速掌握如何在iOS项目中集成和使用iOS-WebP,让你的应用图片处理能力更上一层楼。 #

gitblog_00357的博客 427

为什么选择UIImageView-BetterFace:解决iOS图片裁剪中人脸显示问题的黄金法则

在iOS应用开发中,你是否经常遇到这样的困扰:用户上传的照片在缩略图或头像显示时,人脸被无情地裁剪掉,只剩下下巴或半个头部?这正是UIImageView-BetterFace要解决的痛点!这个强大的UIImageView分类扩展,通过智能人脸检测技术,确保图片裁剪时人脸始终处于最佳显示位置,为用户提供完美的视觉体验。😊 ## 📱 什么是UIImageView-BetterFace? UII

gitblog_00508的博客 743
上一篇: Objective-C 的内省
下一篇: SDWebImage的内部实现过程
小鱼干-鱼爸
博客等级 码龄12年 4粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值