SDWebImage是一个很厉害的图片缓存的框架。既ASIHttp+AsyncImage之后,我一直使用AFNetworking集成的UIImageView+AFNetworking.h,但后者对于图片的缓存实际应用的是NSURLCache自带的cache机制。而NSURLCache每次都要把缓存的raw  data 再转化为UIImage,就带来了数据处理和内存方面的更多操作。具体的比较在这里。

SDWebImage提供了如下三个category来进行缓存。

  • MKAnnotationView(WebCache)
  • UIButton(WebCache)
  • UIImageView(WebCache)

以最为常用的UIImageView为例:

  1. UIImageView+WebCache:  setImageWithURL:placeholderImage:options: 先显示 placeholderImage ,同时由SDWebImageManager 根据 URL 来在本地查找图片。
  2. SDWebImageManager: downloadWithURL:delegate:options:userInfo: SDWebImageManager是将UIImageView+WebCache同SDImageCache链接起来的类, SDImageCache: queryDiskCacheForKey:delegate:userInfo:用来从缓存根据CacheKey查找图片是否已经在缓存中
  3. 如果内存中已经有图片缓存, SDWebImageManager会回调SDImageCacheDelegate : imageCache:didFindImage:forKey:userInfo:
  4. 而 UIImageView+WebCache 则回调SDWebImageManagerDelegate:  webImageManager:didFinishWithImage:来显示图片。
  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 中,内存缓存和硬盘缓存同时保存。
  18. 写文件到硬盘在单独 NSInvocationOperation 中完成,避免拖慢主线程。
  19. 如果是在iOS上运行,SDImageCache 在初始化的时候会注册notification 到 UIApplicationDidReceiveMemoryWarningNotification 以及  UIApplicationWillTerminateNotification,在内存警告的时候清理内存图片缓存,应用结束的时候清理过期图片。
  20. SDWebImagePrefetcher 可以预先下载图片,方便后续使用。

SDWebImage 图片缓存机制相关推荐

  1. Picasso之图片缓存机制二ListView篇

    前面已经个大家介绍Picasso图片缓存机制,大家不熟悉请看上一篇文章http://blog.csdn.net/qq_15950325/article/details/52809380,其实Picas ...

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

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

  3. Android 图片缓存机制

    1.采用线程池  2.内存缓存+文件缓存  3.内存缓存中网上很多是采用SoftReference来防止堆溢出,这儿严格限制只能使用最大JVM内存的1/4  4.对下载的图片进行按比例缩放,以减少内存 ...

  4. 大图片服务器文件缓存,文件和图片缓存机制分享

    # 数据缓存+图片缓存 > 引自tcld2269 ## **demo下载地址**:http://pan.baidu.com/s/1i5JqPFZ * * * * * > 设计思路:1.先从 ...

  5. 自定义SDWebImage图片缓冲区自清理机制

    SDWebImage是一个开源的第三方库,使用AFNetworking集成的UIImageView+AFNetworking.h,它对于图片的缓存实际应用的是NSURLCache自带的cache机制. ...

  6. SDWebImage 图片加载和缓存

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

  7. 图片缓存之内存缓存技术LruCache,软引用

    图片缓存之内存缓存技术LruCache,软引用 每当碰到一些大图片的时候,我们如果不对图片进行处理就会报OOM异常, 这个 问题曾经让我觉得很烦恼 ,后来终于得到了解决, 那么现在就让我和大家一起分享 ...

  8. iOS疯狂详解之AFNetworking图片缓存问题

    AFNetworking网络库已经提供了很好的图片缓存机制,效率是比较高的,但是我发现没有直接提供清除缓存的功能,可项目通常都需要添加 清除功能的功能,因此,在这里我以UIImageView+AFNe ...

  9. iOS SDWebImage 缓存机制与缓存策略

    2019独角兽企业重金招聘Python工程师标准>>> 一.SDWebImage 缓存机制 1.基本用法 SDWebImage提供一个UIImageView的Category,用来加 ...

最新文章

  1. 八个防止浪费时间的小窍门
  2. 操作系统——存储管理:分区、分页、分段、请求式分页和虚拟内存
  3. 1704班3组—高级软件测试作业—如何计算团队成员贡献分
  4. 包含html语言的超链接标记的网页_HTML是什么?
  5. matlab的cylinder函数,matlab cylinder怎么用,Matlab cylinder 函数
  6. 杭电1495非常可乐
  7. 【计算机网络】局域网原理与技术(局域网概述、以太网技术、高速以太网、虚拟局域网、无线局域网)
  8. c语言中有无注释重要吗,求助!有什么问题没考虑到吗? (c语言,大部分注释都写啦)...
  9. EventBus 加强学习深入了解
  10. ORA-01113问题的简单分析
  11. todo: 网口驱动
  12. UNIX编程艺术-艾瑞克.S.理曼德
  13. httpclient 假死问题
  14. 让html img图片垂直居中的三种方法
  15. 查看java进程占用内存_如何查看java进程大批占用内存
  16. 本周最新文献速递20220423
  17. js将一串数字1607222406转换为日期格式
  18. VC++ 获取窗体句柄,并发送键盘消息(这种方法也可以打开某些应用程序)
  19. 云服务器系统安装设置方法,云服务器系统怎么安装
  20. 作为一名合格的JAVA架构师需要点亮哪些技能树?

热门文章

  1. 使用css3的网格(Grid),做出瀑布流式布局
  2. 教你UPS电池估算方法,UPS配置不再难
  3. 如何学习智能手机应用开发?
  4. 【测试数据比对】Python脚本进行数据比对
  5. 如何使用RedisTemplate访问Redis数据结构-记录
  6. android o版本设置灯颜色,在舞台上灯光如何使用颜色?
  7. C语言strlen函数详细讲解
  8. Flutter事件响应源码分析
  9. CF 159 div2 d
  10. 2021年全球及中国玻璃基板行业专利情况分析:中国已成为玻璃基板行业第一大技术来源国[图]