【无限互联】SDWebImage图片缓存流程分析
SDWebImage是一个功能很强大的缓存网络图片的框架。框架实现了异步加载网络图片、自动缓存图片数据等功能。以UIImageView加载网络图片为例,对其总体的加载图片流程做一个大致的分析。 首先使用SDWebImage先要导入 #import "UIImageView+WebCache.h"文件,设置网络图片的图片地址就可以加载图片。
NSURL *url = [NSURL URLWithString:@"http://b.hiphotos.baidu.com/imag1e03d003478ec54e736d196f9.jpg"];
[imageView setImageWithURL:url];
根据网络图片地址,SDWebImageManager类提供了方法downloadWithURL加载图片
id <SDWebImageOperation> operation = [SDWebImageManager.sharedManager downloadWithURL:url options:options progress:progressBlock completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished) {if (!wself) return;dispatch_main_sync_safe(^{if (!wself) return;if (image) {wself.image = image;[wself setNeedsLayout];}if (completedBlock && finished) {completedBlock(image, error, cacheType);}});}];objc_setAssociatedObject(self, &operationKey, operation, OBJC_ASSOCIATION_RETAIN_NONATOMIC);}
进入downloadWithURL方法,由SDImagerCache类提供方法queryDiskCacheForKey检查内存中是否有图片缓存,如果有图片缓存,回调block将图片数据传递给SDWebImageManger类。SDWebImageMange类回调block将图片数据传递给UIImageView+WebCache类去显示图片。
UIImage *image = [self imageFromMemoryCacheForKey:key];if (image) {doneBlock(image, SDImageCacheTypeMemory);return nil;}
如果内存中没有图片缓存,将会去磁盘中查找图片缓存。这一步操作是异步操作,如果从磁盘中读取到图片数据,将图片数据添加到内存缓存中,回调block将图片数据传递给SDWebImageManger类。 SDWebImageMange类回调block将图片数据传递给UIImageView+WebCache类去显示图片
dispatch_async(self.ioQueue, ^{if (operation.isCancelled) {return;}@autoreleasepool {UIImage *diskImage = [self diskImageForKey:key];if (diskImage) {CGFloat cost = diskImage.size.height * diskImage.size.width * diskImage.scale;[self.memCache setObject:diskImage forKey:key cost:cost];}dispatch_async(dispatch_get_main_queue(), ^{doneBlock(diskImage, SDImageCacheTypeDisk);});}
内存和磁盘中都没有图片缓存,由SDWebImageDownloader类downloadImageWithURL方法请求网络下载图片。
- (id <SDWebImageOperation>)downloadImageWithURL:(NSURL *)url options:(SDWebImageDownloaderOptions)options progress:(void (^)(NSInteger, NSInteger))progressBlock completed:(void (^)(UIImage *, NSData *, NSError *, BOOL))completedBlock {
}
图片下载完成后,数据下载完成后交给 SDWebImageDecoder
做图片解码处理,图片解码完成后回调给SDWebImageDownloader类,SDWebImageDownloader类,回调block将图片数据传递给SDWebImageManger类。 SDWebImageMange类回调block将图片数据传递给UIImageView+WebCache类显示图片。
图片数据会写入到内存和磁盘缓存中。图片数据写入磁盘缓存中是异步操作,避免拖慢主线程。
- (void)storeImage:(UIImage *)image recalculateFromImage:(BOOL)recalculate imageData:(NSData *)imageData forKey:(NSString *)key toDisk:(BOOL)toDisk {if (!image || !key) {return;}[self.memCache setObject:image forKey:key cost:image.size.height * image.size.width * image.scale];if (toDisk) {dispatch_async(self.ioQueue, ^{NSData *data = imageData;if (image && (recalculate || !data)) {BOOL imageIsPng = YES;if ([imageData length] >= [kPNGSignatureData length]) {imageIsPng = ImageDataHasPNGPreffix(imageData);}if (imageIsPng) {data = UIImagePNGRepresentation(image);}else {data = UIImageJPEGRepresentation(image, (CGFloat)1.0);}data = [NSBitmapImageRep representationOfImageRepsInArray:image.representations usingType: NSJPEGFileType properties:nil];}if (data) {if (![_fileManager fileExistsAtPath:_diskCachePath]) {[_fileManager createDirectoryAtPath:_diskCachePath withIntermediateDirectories:YES attributes:nil error:NULL];}[_fileManager createFileAtPath:[self defaultCachePathForKey:key] contents:data attributes:nil];}});}
}
总结:
1、SDWebImageManager *manager = [SDWebImageManager sharedManager];管理图片的加载,由SDImagerCache类检查内存中是否有图片缓存,或者由SDWebImageDownloader类请求网络下载图片。
【无限互联】SDWebImage图片缓存流程分析相关推荐
- Glide系列(四) — Glide缓存流程分析
文章目录 一.概述 1.1 背景 1.2 系列文章 二.准备知识 2.1 Glide 的缓存分层结构 2.2 Glide 缓存相关类的关联关系 三.缓存的获取流程 3.1 缓存获取的入口 3.2 内存 ...
- ios html清除缓存图片,iOS SDWebImage图片缓存处理
前言 以前一直使用,也没有花太多时间去看看实现的机制,现在抽时间好好研究一下,只有明白里面的实现才能使用的更顺手,即便出现问题,也能很快定位问题的位置. 导入头文件#import "SDWe ...
- SDWebImage 图片缓存机制
SDWebImage是一个很厉害的图片缓存的框架.既ASIHttp+AsyncImage之后,我一直使用AFNetworking集成的UIImageView+AFNetworking.h,但后者对于图 ...
- Skia图片解码模块流程分析
我在在PPAPI插件中使用Skia绘图中说可以在PPAPI插件内使用Skia来绘图.这里面会有一个与色彩空间(像素格式)相关的问题.在那篇文章里我们在PPAPI中使用PPB_ImageData创建2D ...
- SDWebImage 图片加载和缓存
SDWebImage github : https://github.com/rs/SDWebImage 这个类库提供一个UIImageView类别以支持加载来自网络的远程图片.具有缓存管理.异步下载 ...
- 【Android SDM660源码分析】- 03 - UEFI XBL GraphicsOutput BMP图片显示流程
[Android SDM660源码分析]- 03 - UEFI XBL GraphicsOutput BMP图片显示流程 1. GraphicsOutput.h 2. 显示驱动初化 DisplayDx ...
- 【转载】基于AFNetWorking3.0的图片缓存分析
原文出处:Yasin的简书 http://www.jianshu.com/p/b1045c3fc8d0 图片在APP中占有重要的角色,对图片做好缓存是重要的一项工作. [TOC] 理论 不喜欢理论的可 ...
- SDWebImage实现原理(怎么实现图片缓存器)
入口 setImageWithURL:placeholderImage:options: 会先把 placeholderImage 显示,然后 SDWebImageManager 根据 URL 开始处 ...
- 清空缓存的命令_超详细的mysql数据库查询缓存原理解析、涉及命令、流程分析等...
概述 mysql查询缓存在数据库优化可以起到很大的作用,今天主要针对这一块做一个总结,下面一起来看看吧~ 一.缓存条件,原理 MySQL Query Cache是用来缓存我们所执行的SELECT语句以 ...
- iOS开发--基于AFNetWorking3.0的图片缓存分析
图片在APP中占有重要的角色,对图片做好缓存是重要的一项工作.[TOC] 理论 不喜欢理论的可以直接跳到下面的Demo实践部分 缓存介绍 缓存按照保存位置可以分为两类:内存缓存.硬盘缓存(FMDB.C ...
最新文章
- hikaridatasource 加密后登陆不上_python测试开发django42.auth模块登陆认证
- Vivado 自定义VHDL的IP核
- ZOj 2104——Let the Balloon Rise
- Encoder-Decoder模型和Attention模型
- vue按钮Button
- 让OpenShift Serivce Mesh自动对服务注入sidecar
- selenium python怎么断言_如何为python / selenium中的特定元素断言文本?
- 区块链共识机制优缺点对比都是什么
- android json字符串转成json对象_【hive】解析JSON格式字符串
- iocomp控件使用教程-V5版本
- 华硕电脑(博主电脑型号为天选FA506IH)Fn组合键屏幕不显示对应操作的解决办法!!
- 计算机毕业设计JAVA‘大学生心理健康咨询管理系统mybatis+源码+调试部署+系统+数据库+lw
- 炫酷网站模板,css,html
- 扫呗扫码点餐,如何在扫呗后台给这个商户配一下支付授权地址
- vnc以及xfce安装\xrdp连接
- switch判断语句用法
- Oracle数据库中神奇的dual表
- 联通宽带拨号开机自动连接
- JS身份证号码校验,JS根据身份证号码获取出生年月日,JS根据出生年月日获取年龄,JS根据身份证号码获取性别
- 华为数通HCIA学习资料学习总结
热门文章
- Elasticsearch和Kibana版本对应关系
- 一看就懂系列:什么是相速度与群速度
- html网页直播实时聊天,一分钟实现网页多人聊天室【Socket.IO】
- 圆弧周长公式_求圆弧长度计算公式
- matlab求含参数一元三次方程,matlab 求解一元三次方程,带其他参数
- Ubuntu关机(shut down)(power off)后不断电的问题
- Aho_Corasick_Automaton
- 什么是嵌入式开发?嵌入式是什么?初学者必看。
- POI导出Excel时 设置单元格类型为 数值类型 或者文本类型
- Java程序设计基础学习