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类请求网络下载图片。

2、SDImageCache 类管理图片缓存,读取图片缓存和写入图片缓存。
3、SDWebImageDownloader,根据URL向网络读取数据。


【无限互联】SDWebImage图片缓存流程分析相关推荐

  1. Glide系列(四) — Glide缓存流程分析

    文章目录 一.概述 1.1 背景 1.2 系列文章 二.准备知识 2.1 Glide 的缓存分层结构 2.2 Glide 缓存相关类的关联关系 三.缓存的获取流程 3.1 缓存获取的入口 3.2 内存 ...

  2. ios html清除缓存图片,iOS SDWebImage图片缓存处理

    前言 以前一直使用,也没有花太多时间去看看实现的机制,现在抽时间好好研究一下,只有明白里面的实现才能使用的更顺手,即便出现问题,也能很快定位问题的位置. 导入头文件#import "SDWe ...

  3. SDWebImage 图片缓存机制

    SDWebImage是一个很厉害的图片缓存的框架.既ASIHttp+AsyncImage之后,我一直使用AFNetworking集成的UIImageView+AFNetworking.h,但后者对于图 ...

  4. Skia图片解码模块流程分析

    我在在PPAPI插件中使用Skia绘图中说可以在PPAPI插件内使用Skia来绘图.这里面会有一个与色彩空间(像素格式)相关的问题.在那篇文章里我们在PPAPI中使用PPB_ImageData创建2D ...

  5. SDWebImage 图片加载和缓存

    SDWebImage github : https://github.com/rs/SDWebImage 这个类库提供一个UIImageView类别以支持加载来自网络的远程图片.具有缓存管理.异步下载 ...

  6. 【Android SDM660源码分析】- 03 - UEFI XBL GraphicsOutput BMP图片显示流程

    [Android SDM660源码分析]- 03 - UEFI XBL GraphicsOutput BMP图片显示流程 1. GraphicsOutput.h 2. 显示驱动初化 DisplayDx ...

  7. 【转载】基于AFNetWorking3.0的图片缓存分析

    原文出处:Yasin的简书 http://www.jianshu.com/p/b1045c3fc8d0 图片在APP中占有重要的角色,对图片做好缓存是重要的一项工作. [TOC] 理论 不喜欢理论的可 ...

  8. SDWebImage实现原理(怎么实现图片缓存器)

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

  9. 清空缓存的命令_超详细的mysql数据库查询缓存原理解析、涉及命令、流程分析等...

    概述 mysql查询缓存在数据库优化可以起到很大的作用,今天主要针对这一块做一个总结,下面一起来看看吧~ 一.缓存条件,原理 MySQL Query Cache是用来缓存我们所执行的SELECT语句以 ...

  10. iOS开发--基于AFNetWorking3.0的图片缓存分析

    图片在APP中占有重要的角色,对图片做好缓存是重要的一项工作.[TOC] 理论 不喜欢理论的可以直接跳到下面的Demo实践部分 缓存介绍 缓存按照保存位置可以分为两类:内存缓存.硬盘缓存(FMDB.C ...

最新文章

  1. hikaridatasource 加密后登陆不上_python测试开发django42.auth模块登陆认证
  2. Vivado 自定义VHDL的IP核
  3. ZOj 2104——Let the Balloon Rise
  4. Encoder-Decoder模型和Attention模型
  5. vue按钮Button
  6. 让OpenShift Serivce Mesh自动对服务注入sidecar
  7. selenium python怎么断言_如何为python / selenium中的特定元素断言文本?
  8. 区块链共识机制优缺点对比都是什么
  9. android json字符串转成json对象_【hive】解析JSON格式字符串
  10. iocomp控件使用教程-V5版本
  11. 华硕电脑(博主电脑型号为天选FA506IH)Fn组合键屏幕不显示对应操作的解决办法!!
  12. 计算机毕业设计JAVA‘大学生心理健康咨询管理系统mybatis+源码+调试部署+系统+数据库+lw
  13. 炫酷网站模板,css,html
  14. 扫呗扫码点餐,如何在扫呗后台给这个商户配一下支付授权地址
  15. vnc以及xfce安装\xrdp连接
  16. switch判断语句用法
  17. Oracle数据库中神奇的dual表
  18. 联通宽带拨号开机自动连接
  19. JS身份证号码校验,JS根据身份证号码获取出生年月日,JS根据出生年月日获取年龄,JS根据身份证号码获取性别
  20. 华为数通HCIA学习资料学习总结

热门文章

  1. Elasticsearch和Kibana版本对应关系
  2. 一看就懂系列:什么是相速度与群速度
  3. html网页直播实时聊天,一分钟实现网页多人聊天室【Socket.IO】
  4. 圆弧周长公式_求圆弧长度计算公式
  5. matlab求含参数一元三次方程,matlab 求解一元三次方程,带其他参数
  6. Ubuntu关机(shut down)(power off)后不断电的问题
  7. Aho_Corasick_Automaton
  8. 什么是嵌入式开发?嵌入式是什么?初学者必看。
  9. POI导出Excel时 设置单元格类型为 数值类型 或者文本类型
  10. Java程序设计基础学习