EGOimage 和 SDWebImage

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


之前用过EGOimage,但是里面有一个bug,虽然解决了,但是还是不想用了,原因是什么呢,一是有bug觉得不高端了,而是SDWebImage也不错,就用用试试

原文

我之前写过一篇博客,介绍缓存处理的三种方式,其中最难,最麻烦,最占内存资源的还是图片缓存,最近做的项目有大量的图片处理,还是采用了SDWebImage来处理,但是发现之前封装好的代码报错了。研究发现,是我用了新版的SDWebImage,好多方法都变了。

现在把代码贴出来,供大家参考。尤其是新手,看完这篇博客,图片缓存so easy。最后有demo供大家下载,先学习。

第一步,下载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 下载图片一是无法缓存,二是体. 阅读详情

相关推荐

掌握iOS平台的EGOImage异步图片加载技术

除了核心的加载和缓存功能,EGOImage还允许开发者自定义图片请求。自定义请求接口可以支持额外的图片处理需求,如图片裁剪、图片转码、添加HTTP头部等。通过实现协议,开发者可以创建自己的图片请求处理器:// 自定义网络请求逻辑// ...// 使用自定义请求处理器在上述代码示例中,我们创建了一个类,实现了方法。在该方法中,我们自定义了图片请求的实现细节,然后将其赋值给的属性,使得所有的图片加载请求都会使用我们自定义的处理器进行处理。

weixin_30218749的博客 1048

最新版SDWebImage的使用

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

专注移动开发 948

C# 读取图片和扫描PDF中的文本

本博客将探讨如何使用C#和OCR库实现从图片和扫描的 PDF 中提取文本。Spire.OCR for .NET 是一个OCR文字识别库,专为在 .NET 应用程序中识别图片的文本而设计。首先,使用 Spire.PDF 将扫描的 PDF 转换为图片,然后利用 Spire.OCR 从这些图片中提取文本。由于该OCR库并不支持直接处理PDF,因此要从扫描的 PDF 中提取文本,我们首先需要将 PDF 文档转换为图片。转换完成后,再利用 Spire.OCR 从生成的图片中提取文本。方法来识别图片中的文本。

nuclear2011的博客 5400

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)  

HOPE:基于强化学习的混合策略路径规划器,适用于多样化停车场景

本文提出了一种混合策略路径规划器(HOPE),用于解决自动停车中的路径规划问题。HOPE结合了强化学习(RL)和Reeds-Shepp(RS)曲线,通过动作掩码机制引导RL智能体的探索,并利用Transformer融合环境感知信息与掩码。该方法在多样且复杂的停车场景中实现了超过97%的成功率,并通过真实实验验证了其泛化能力。此外,本文还提出了基于空间与障碍物分布的停车场景难度分级标准,进一步提升了训练与评估的效率。实验结果表明,HOPE在规划成功率和跨场景泛化能力上均优于传统的基于规则算法和朴素强化学习方法

weixin_42783201的博客 1466

【分享】获取微信通讯录python代码形式实现

微信号”, “昵称”, “地区”, “备注”, “标签”, “签名”, “来源”5. 找到最后一个空格所在的位置(后一个就是真正的联系人了)当前微信号与上一个相同的时候,说明到底部了,可以跳出循环。3. 滚动鼠标到最顶部(防止已经滚动了一部分了)7.记录下上一个联系人的微信号。7. 无限循环按键盘下箭头。获取详情中的以下元素内容。6. 点击第一个联系人。4. 获取联系人列表。

程序员老狼专注开发aigc或客服系统应用 2892

SDWebImage 加载图片流程

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

得不到的永远是骚栋. 1864

【学习笔记】人群归因分数 PAF 以及combined PAF

人群归因风险比例(Population Attributable Fraction,PAF)是一个流行病学指标,它估计了在总体中,如果能消除一个特定的危险因素,能预防多少百分比的疾病或健康结果。简单来说,PAF回答的是:“如果没有这个风险因素,总体中会有多少病例是可以避免的?

weixin_53499537的博客 4898

iOS三级缓存库的实现心得

前段时间因为工作需要就自己写了一个iOS的三级缓存库主要用来缓存文本(缓存到数据库中)和图片(缓存到自己指定的本地目录下)。 注:其实利用现有的第三方库(比如:SDWebImage, EGOImage)可以完成我们的大部分功能,但这里有一些定制化的功能,比如不同模块的图片要缓存在不同的目录中,以便于以后查找和清理,所以就选择了自己来封装一个。 在写这个库时,学到了很多封装东西时的思想,比如先要

yuanhuachao89的专栏 3380

Python制作【大麦网】自动抢票程序

Python 的迅速崛起对整个行业来说都是极其有利的,但“人红是非多”,导致它平添了许许多多的批评,不过依旧挡不住它火爆的发展势头。如果你对Python感兴趣,想要学习pyhton,这里给大家分享一份Python全套学习资料,都是我自己学习时整理的,希望可以帮到你,一起加油!😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓点击这里。

mate1357的博客 2万+

SRA数据库

简介 序列读取存档(sequence Read Archive,SRA)数据是可通过多个云提供商和NCBI服务器获得的,它是最大的可公开获得的高通量测序数据存储库。 SRA接受来自生活各个部门以及宏基因组学和环境调查的数据。 SRA存储原始测序数据和比对信息,以提高可重复性并通过数据分析促进新发现。 NCBI网站储存二代测序原始数据的数据库 SRA官网 从Entrez搜索结果中下载SRA序列 例如查找SRA Entrez中BALB / c小鼠淋巴结组织的RNA-Seq记录 获取搜索结果 SRA se

qq_44520665的博客 5905

iPhone开发笔记(20)EGOImageView的使用方法及注意事项

EGOImageView是一种实现网络图片的异步加载和缓存的第三方类库,具有相同功能的第三方类库还有SDWebImage。但是相比两个类库的安装和使用来说,EGOImageView更简单一些,下面就介绍一下EGOImageView的使用方法:     1、下载EGOImageView及其相关的类库     EGOImageLoading     将EGOCache、EGOImageButto

kbawyg的专栏 1万+

Open3D——点云构建Delaunay三角网【2026最新版】

点云构建Delaunay三角网

点云侠的博客 8365

一个异步加载图片的公用类: EGOImageLoading

逛论坛的时候,发现偶尔还会有人在问怎么做图片的异步加载,很多回答都还是告知用原始的connection,收到数据NSData以后, 再用UIImage initWithData生成图片对象。对于刚开始接触iOS开发的人来说,我还是推荐用这种方式的。但是对于已经有一定iOS 开发经验的人来说,我推荐你们用比较成熟的第三方公用类。 为什么这么说呢, 1) 首先图片异步加载属于一个公共的

liyonghuaxin的专栏 731

基于STM32XX的LCD液晶显示屏(HS19264G06A、驱动芯片:ST7525)驱动C程序设计

define USE_HW_SPI 1 // 1:使用硬件SPI, 0:使用软件模拟SPI。

myron6688的博客 234

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

SDWebImage缓存策略

SDWebImage:双重缓存机制:memory缓存、disk缓存(内存缓存、磁盘缓存) SDWebImageManager单例:里面有两个重要属性:SDWebImageCache(处理缓存)、SDWebImageDownLoader(处理下载) sd_setImageWithURL方法:首先会调用SDWebImageCache的queryDiskCacheForKey查询方法(以url为ke...

weixin_36218496的博客 819

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

SDWebImage学习

SDWebImage学习

我的博客 566

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

sd_setImageWithURL加载图片失败原因以及处理方法

1,确定图片地址是否正确比如我在网上找了一个图片 @"http://image.baidu.com/search/detail?ct=503316480&z=0&ipn=d&word=%E5%9B%BE%E7%89%87&hs=0&pn=0&spn=0&di=53059380110&pi=0&rn=1&tn=baiduimagedetail&is=0%2C0&ie=utf-8&oe=utf-8&

qq_32666701的博客 1万+

ios SDWebImage 加载图片流程

入口 setImageWithURL:placeholderImage:options: 会先把 placeholderImage 显示,然后 SDWebImageManager 根据 URL 开始处理图片。进入 SDWebImageManager-downloadWithURL:delegate:options:userInfo:,交给 SDImageCache 从缓存查找图片是否已经下载 q

hengshujiyi的专栏 1871

SDWebImage常用方法

//常用方法一 - (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder; //例如: [cell.imageView sd_setImageWithURL:[NSURL URLWithString:@"图片地址"]placeholderImage:[UIImage imageNamed:@"p

SKYHIKu的博客 823

SDWebImage指定缓存图片大小

这几天在做iOS上的网络图片的异步加载和缓存。网上查了下,决定用SDWebImage实现。按照网络的教程,走了一遍,没什么问题。但是程序运行起来发现加载起来的图片都变得很模糊,本人有一点平面设计的经验。推测是因为图片太大的造成的细节都是,从而使图片变的模糊。进到程序的缓存文件目录,可以看到下载的图片果真和直接从网页上下载的一样大,即图片没有经过压缩就被缓存起来了。但是我的要求应该是图片应该在保存时

It's just a matter of time. 1万+

ios-SDWebImage知识点

默认的缓存时间是1个星期,一个星期过后会自动删除1个星期前的缓存对象。设置缓存时间,这个是保存在硬盘上的 _maxCacheAge = kDefaultCacheMaxCacheAge; static const NSInteger kDefaultCacheMaxCacheAge = 60 * 60 * 24 * 7; 如果保存在内存中,SDWebImage默认是用Cache来做的 使用缓

rv0p111 724

sdwebimage使用详解大全

第一步,下载SDWebImage,导入工程。github托管地址https://github.com/rs/SDWebImage 第二步,在需要的地方导入头文件 #import "UIImageView+WebCache.h"第三步,调用sd_setImageWithURL:方法缓存图片,注意,这就是新版本的新方法,旧方法是setImageWithURL:。下面将几个方法都介绍一下

sky_2016的专栏 1774

【iOS开发】—— SDWebImage源码学习(未完)

文章目录什么是SDWebImage?sd_setImageWithURL使用步骤UIImageView+WebCacheUIView+WebCacheSDWebImageManagerSDImageCacheSDWebImageDownloader其余: 什么是SDWebImage? SDWebImage是iOS开发中被广泛使用的第三方开源库,它提供了图片从加载、解析、缓存、清理等一系列功能。 平时我们引进这个第三方库,最主要的就是使用sd_setImageWithURL方法。下面是他的官方调用图: 通过

weixin_50990189的博客 2358
上一篇: Contentoffset
下一篇: CocoaPods安装和使用教程
github_26452845
博客等级 码龄12年 1粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值