推广

SDWebImage实现原理

iseeyu2年前 (2024-02-22)推广127

加载流程

SDWebImage提供一个UIImageView的类别以支持加载来自互联网的远程图片。具有缓存管理、异步下载,同一个URL下载次数控制和优化等特征。

独立的异步图像缓存

SDImageCache类提供一个管理缓存的单例类。
SDImageCache *imageCache = [SDImageCache sharedImageCache]
查找和缓存图片时以URL作为key。(先查找内存,如果内存不存在该图片,再查找硬盘;查找硬盘时,以URL的MD5值作为key).
查找图片:
UIImage *cacheImage = [imageCache mageFromKey:myCacheKey];
缓存图片:
[ imageCache storeImage:myImage forKey:myCacheKey];
默认情况下,图片是被存储到内存缓存和磁盘缓存中的。如果仅仅是想缓存到内存中,可以用下面方法:
storeImage:forKey:toDisk: 第三个参数传NO即可。

主要用到的对象:

1.UIImageView(WebCache),入口封装,实现读取图片完成后的回调。

2.SDWebImagemanager,对图片进行管理的中转站,记录那些图片正在读取。向下层读取Cache(调用SDImageCache),或者向网络读取对象(调用SDWebImageDownloader)。实现SDImageCache和SDWebImageDownLoader的回调。

3.SDImageCache,根据URL作为key,对图片进行存储和读取(存在内存(以URL作为key)和存在硬盘两种(以URL的MD5值作为key))。实现图片和内存清理工作。

SDWebImage加载图片的流程

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

2.进入SDWebImageManager 类中downloadWithURL:delegate:options:userInfo:,交给SDImageCache从缓存查找图片是否已经下载queryDiskCacheForKey:delegate:userInfo:.

3.先从内存图片缓存查找是否有图片,如果内存中已经有图片缓存,SDImageCacheDelegate回调 imageCache:didFindImage:forKey:userInfo:到SDWebImageManager。

4.SDWebImageManagerDelegate 回调webImageManager:didFinishWithImage: 到UIImageView+WebCache,等前端展示图片。

5.如果内存缓存中没有,生成 ”NSOperation“ 添加到队列,开始从硬盘查找图片是否已经缓存。

6.根据 URL的MD5值Key在硬盘缓存目录下尝试读取图片文件。这一步是在 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中,内存缓存和硬盘缓存同时保存。写文件到硬盘 也在以单独 NSOperation 完成,避免拖慢主线程。

18.SDImageCache 在初始化的时候会注册一些消息通知,在内存警告或退到后台的时 候清理内存图片缓存,应用结束的时候清理过期图片。

扫描二维码推送至手机访问。

版权声明:本文由西安泽虎代运营发布,如需转载请注明出处。

转载请注明出处https://www.0291.com.cn/post/55890.html

相关文章

模式效应——颠覆传统和跨界掠夺的营销绝杀

模式效应——颠覆传统和跨界掠夺的营销绝杀

随着互联网技术的发展和电子商务的实践运用,尤其是2013年至2014年,“互联网”“互联网+”“O2O”和“互联网转型”等概念的热炒,不少来源于互联网公司的专家和大师开始鼓吹用互联网重新设计商业模式。在他们的概念中,只要你运用了互联网,就等于改变了传统的商业模式。其实,这种...

不恰当的网站制作有可能会降低用户留存率。

不恰当的网站制作有可能会降低用户留存率。

作为一个企业,你是否以错误的方式制作网站?许多企业没有明确的目标用户,没有对网站建设的每个环节进行具体规划,但他们可能没有细分就制定了计划,但的目的是为了获得更多的目标用户。只有详细的网站规划才能使企业发展的方向更加明确。我们需要分析不同用户的行为。 提醒您在网站建设中,应注意一些相应的...

日历App大揭秘!2016年中国第三方日历App用户洞察报告

日历App大揭秘!2016年中国第三方日历App用户洞察报告

中国第三方日历类App发展现状 依托智能手机发展,日历类App全球潜在市场巨大。而第三方日历类App(非手机系统自带、可在应用市场下载的日历类App)行业集中度较高,在月独立设备数、月总使用次数及月有效使用时长三个指标方面,中华万年历与万年历(随身云旗下产品)用户占比均超过70%。其中,...

百度与谷歌排名的差别是什么。

百度与谷歌排名的差别是什么。

  最近用seo三人行的工具分析了一个词的竞争难度以及每个外链传递权重的比率,然后买了一些权重传递比率比较高的外链,过了一段时间发现百度与谷歌给的排名是完全不一样的。那么百度与谷歌的排名差别在哪里呢?   百度会根据网站的外链以及内容的相关性计算整体网页的权重,也就是说百度不会因为你的锚文本...

企业营销获客渠道

企业营销获客渠道

  企业获客  对于企业来说,如果产品找不到一个合适和有效的渠道,企业很难经营下去。在时代,通过运营商大可以帮助企业带来成千上万的潜在客户,也符合未来的营销趋势。  因此,下面就为大家盘点一下主要营销获客渠道,希望对大家有所启发。  付费获客渠道  信息流:如今信息流应该是...

关键词排名监控的目的和关键词排名的优化

关键词排名监控的目的和关键词排名的优化

熟悉的人都知道现在在网上有很多的排名和关键词排名优化,这样做会有什么作用呢,下面就让我们一起来了解一下关键词排名监控的和关键词排名的优化吧。 关键词排名监控的目的 一,关键词排名 关键词排名是一种在搜索引擎搜索结果中以字、词、词组的相关性体现网页排名的方式。可以分为关键词自然排名以及...

现在,非常期待与您的又一次邂逅

我们努力让每一部企业宣传片和抖音短视频成为商业大片