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 可以预先下载图片,方便后续使用。

转载于:https://www.cnblogs.com/sleblogs/p/5528664.html

SDWebImage缓存图片的机制(转)相关推荐

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

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

  2. 使用开源库 SDWebImage 异步下载缓存图片(持续更新)

    source  https://github.com/rs/SDWebImage APIdoc  http://hackemist.com/SDWebImage/doc Asynchronous im ...

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

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

  4. iOS开发:利用SDWebImage实现图片加载与缓存

    iOS开发:利用SDWebImage实现图片加载与缓存 SDWebImage是一套开源框架,这个类库提供一个UIImageView类别以支持加载来自网络的远程图片.具有缓存管理.异步下载.同一个URL ...

  5. ios html清除缓存图片,iOS利用SDWebImage实现缓存的计算与清理

    一般我们项目中的缓存一般分为2大块:一个是自己缓存的一些数据;还有一个就是我们使用的SDWebImage这个第三方库给我们自动缓存的图片文件缓存了. 实际项目中会配合设置里去清理缓存, 效果截图如下: ...

  6. [Swift]在不依赖三方库的情况下如何异步下载和缓存图片?

    在可滚动视图(如UITableView)中异步加载大量图片是一个很常见的任务. 然而,在图片正在下载的同时又要保持应用程序流畅滚动,可能有点挑战. 许多开发人员依靠像Alamofire和SDWebIm ...

  7. glide等图片缓存框架替换缓存图片解决方案

    2019独角兽企业重金招聘Python工程师标准>>> 应用场景: 手机app 用户的头像地址 在服务器上是固定的,比如有些服务器喜欢以 用户手机或者用户id 作为唯一标识,那么用户 ...

  8. 里面怎么缓存图片_浏览器缓存原理总结

    一.浏览器缓存基本认识 分为强缓存和协商缓存 1.浏览器在加载资源时,先根据这个资源的一些http header判断它是否命中强缓存,强缓存如果命中,浏览器直接从自己的缓存中读取资源,不会发请求到服务 ...

  9. Android使用 LruCache 缓存图片

    2019独角兽企业重金招聘Python工程师标准>>> 使用图片缓存技术 在你应用程序的UI界面加载一张图片是一件很简单的事情,但是当你需要在界面上加载一大堆图片的时候,情况就变得复 ...

  10. Universal-imageLoader缓存图片加载

    一,先要配置ImageLoaderConfiguration这个类实现全局ImageLoader的实现情况 ImageLoaderConfiguration config = new ImageLoa ...

最新文章

  1. netty3超长字符串
  2. c# tcp备忘及networkstream.length此流不支持查找解决
  3. 多区域显示(8)-透明花边
  4. python怎么画多重饼状图_Python通过matplotlib画双层饼图及环形图简单示例
  5. bzoj4196:[Noi2015]软件包管理器
  6. 【struts2】struts2的零配置
  7. 登录业务介绍(单点登录)
  8. edxp显示未安装_如何在 Centos 8 / RHEL 8 上安装和配置 VNC 服务器
  9. UIViewController 小结
  10. java中的显示初始化和特定初始化
  11. linux进程通讯-纯文本文件1
  12. 接待顾客接待久了,发现大家讨价还价的方式基本三种
  13. 【SimpleITK】Resampling重采样
  14. python环境下数据操作_在windows环境下使用Python操作spatialite数据库
  15. 集合竞价与连续竞价(开盘价、收盘价的生成)
  16. TextView的居中显示、多行显示、单行显示且显示不完用省略号替代...
  17. 公司里的技术总监CTO,天天都在干些啥?
  18. 教育培训学校的网络推广方案
  19. 华云数据董事长许广彬接受中央电视台采访:推动职业教育发展 打造信创人才核心竞争力
  20. 【C语言】判断三角形形状

热门文章

  1. override java field_JAVA方法的重载(overload)和覆盖(override)
  2. es6 将字符串转换为json_ES6中Json、String、Map、Object之间的转换
  3. Servlet chapter 2
  4. PHP面向对象之方法重写
  5. Spring ApplicationListener 事件监听器,能监听容器中所有实例
  6. Spring Boot 默认数据源 HikariDataSource 与 JdbcTemplate 初遇
  7. 详细配置swagger2
  8. springboot 对象 空指针_springboot获取getBean方法以及ApplicationContext空指针问题解决...
  9. cookie和session的区别及其原理
  10. Ubuntu 文件文件夹查看权限和设置权限