SDWebImage缓存图片的机制(转)
SDWebImage提供了如下三个category来进行缓存。
- MKAnnotationView(WebCache)
- UIButton(WebCache)
- UIImageView(WebCache)
以最为常用的UIImageView为例:
- UIImageView+WebCache:
setImageWithURL:placeholderImage:options:
先显示 placeholderImage ,同时由SDWebImageManager 根据 URL 来在本地查找图片。 - SDWebImageManager:
downloadWithURL:delegate:options:userInfo:
SDWebImageManager是将UIImageView+WebCache同SDImageCache链接起来的类, SDImageCache:queryDiskCacheForKey:delegate:userInfo:
用来从缓存根据CacheKey查找图片是否已经在缓存中 - 如果内存中已经有图片缓存, SDWebImageManager会回调SDImageCacheDelegate :
imageCache:didFindImage:forKey:userInfo:
- 而 UIImageView+WebCache 则回调SDWebImageManagerDelegate:
webImageManager:didFinishWithImage:
来显示图片。 - 如果内存中没有图片缓存,那么生成 NSInvocationOperation 添加到队列,从硬盘查找图片是否已被下载缓存。
- 根据 URLKey 在硬盘缓存目录下尝试读取图片文件。这一步是在 NSOperation 进行的操作,所以回主线程进行结果回调
notifyDelegate:
。 - 如果上一操作从硬盘读取到了图片,将图片添加到内存缓存中(如果空闲内存过小,会先清空内存缓存)。SDImageCacheDelegate 回调
imageCache:didFindImage:forKey:userInfo:
。进而回调展示图片。 - 如果从硬盘缓存目录读取不到图片,说明所有缓存都不存在该图片,需要下载图片,回调
imageCache:didNotFindImageForKey:userInfo:
。 - 共享或重新生成一个下载器
SDWebImageDownloader
开始下载图片。 - 图片下载由 NSURLConnection 来做,实现相关 delegate 来判断图片下载中、下载完成和下载失败。
connection:didReceiveData:
中利用 ImageIO 做了按图片下载进度加载效果。connectionDidFinishLoading:
数据下载完成后交给SDWebImageDecoder
做图片解码处理。- 图片解码处理在一个 NSOperationQueue 完成,不会拖慢主线程 UI。如果有需要对下载的图片进行二次处理,最好也在这里完成,效率会好很多。
- 在主线程
notifyDelegateOnMainThreadWithInfo:
宣告解码完成,imageDecoder:didFinishDecodingImage:userInfo:
回调给 SDWebImageDownloader。 imageDownloader:didFinishWithImage:
回调给 SDWebImageManager 告知图片下载完成。- 通知所有的 downloadDelegates 下载完成,回调给需要的地方展示图片。
- 将图片保存到 SDImageCache 中,内存缓存和硬盘缓存同时保存。
- 写文件到硬盘在单独 NSInvocationOperation 中完成,避免拖慢主线程。
- 如果是在iOS上运行,SDImageCache 在初始化的时候会注册notification 到 UIApplicationDidReceiveMemoryWarningNotification 以及 UIApplicationWillTerminateNotification,在内存警告的时候清理内存图片缓存,应用结束的时候清理过期图片。
SDWebImagePrefetcher
可以预先下载图片,方便后续使用。
转载于:https://www.cnblogs.com/sleblogs/p/5528664.html
SDWebImage缓存图片的机制(转)相关推荐
- iOS SDWebImage 缓存机制与缓存策略
2019独角兽企业重金招聘Python工程师标准>>> 一.SDWebImage 缓存机制 1.基本用法 SDWebImage提供一个UIImageView的Category,用来加 ...
- 使用开源库 SDWebImage 异步下载缓存图片(持续更新)
source https://github.com/rs/SDWebImage APIdoc http://hackemist.com/SDWebImage/doc Asynchronous im ...
- ios html清除缓存图片,iOS SDWebImage图片缓存处理
前言 以前一直使用,也没有花太多时间去看看实现的机制,现在抽时间好好研究一下,只有明白里面的实现才能使用的更顺手,即便出现问题,也能很快定位问题的位置. 导入头文件#import "SDWe ...
- iOS开发:利用SDWebImage实现图片加载与缓存
iOS开发:利用SDWebImage实现图片加载与缓存 SDWebImage是一套开源框架,这个类库提供一个UIImageView类别以支持加载来自网络的远程图片.具有缓存管理.异步下载.同一个URL ...
- ios html清除缓存图片,iOS利用SDWebImage实现缓存的计算与清理
一般我们项目中的缓存一般分为2大块:一个是自己缓存的一些数据;还有一个就是我们使用的SDWebImage这个第三方库给我们自动缓存的图片文件缓存了. 实际项目中会配合设置里去清理缓存, 效果截图如下: ...
- [Swift]在不依赖三方库的情况下如何异步下载和缓存图片?
在可滚动视图(如UITableView)中异步加载大量图片是一个很常见的任务. 然而,在图片正在下载的同时又要保持应用程序流畅滚动,可能有点挑战. 许多开发人员依靠像Alamofire和SDWebIm ...
- glide等图片缓存框架替换缓存图片解决方案
2019独角兽企业重金招聘Python工程师标准>>> 应用场景: 手机app 用户的头像地址 在服务器上是固定的,比如有些服务器喜欢以 用户手机或者用户id 作为唯一标识,那么用户 ...
- 里面怎么缓存图片_浏览器缓存原理总结
一.浏览器缓存基本认识 分为强缓存和协商缓存 1.浏览器在加载资源时,先根据这个资源的一些http header判断它是否命中强缓存,强缓存如果命中,浏览器直接从自己的缓存中读取资源,不会发请求到服务 ...
- Android使用 LruCache 缓存图片
2019独角兽企业重金招聘Python工程师标准>>> 使用图片缓存技术 在你应用程序的UI界面加载一张图片是一件很简单的事情,但是当你需要在界面上加载一大堆图片的时候,情况就变得复 ...
- Universal-imageLoader缓存图片加载
一,先要配置ImageLoaderConfiguration这个类实现全局ImageLoader的实现情况 ImageLoaderConfiguration config = new ImageLoa ...
最新文章
- netty3超长字符串
- c# tcp备忘及networkstream.length此流不支持查找解决
- 多区域显示(8)-透明花边
- python怎么画多重饼状图_Python通过matplotlib画双层饼图及环形图简单示例
- bzoj4196:[Noi2015]软件包管理器
- 【struts2】struts2的零配置
- 登录业务介绍(单点登录)
- edxp显示未安装_如何在 Centos 8 / RHEL 8 上安装和配置 VNC 服务器
- UIViewController 小结
- java中的显示初始化和特定初始化
- linux进程通讯-纯文本文件1
- 接待顾客接待久了,发现大家讨价还价的方式基本三种
- 【SimpleITK】Resampling重采样
- python环境下数据操作_在windows环境下使用Python操作spatialite数据库
- 集合竞价与连续竞价(开盘价、收盘价的生成)
- TextView的居中显示、多行显示、单行显示且显示不完用省略号替代...
- 公司里的技术总监CTO,天天都在干些啥?
- 教育培训学校的网络推广方案
- 华云数据董事长许广彬接受中央电视台采访:推动职业教育发展 打造信创人才核心竞争力
- 【C语言】判断三角形形状
热门文章
- override java field_JAVA方法的重载(overload)和覆盖(override)
- es6 将字符串转换为json_ES6中Json、String、Map、Object之间的转换
- Servlet chapter 2
- PHP面向对象之方法重写
- Spring ApplicationListener 事件监听器,能监听容器中所有实例
- Spring Boot 默认数据源 HikariDataSource 与 JdbcTemplate 初遇
- 详细配置swagger2
- springboot 对象 空指针_springboot获取getBean方法以及ApplicationContext空指针问题解决...
- cookie和session的区别及其原理
- Ubuntu 文件文件夹查看权限和设置权限