SDWebImage内部实现过程

本文详细解析了SDWebImage库如何高效地处理图片下载、缓存及显示的过程,包括内存和硬盘缓存机制、图片解码及异步操作等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第三方开源在给我们带来便利的同时也会让我们偷懒,不去真真理解其中的原理。平时项目开发中,经常我们会涉及到图片的下载,可能我们对下面的代码的并不陌生:
[self.iconView setImageWithURL:[NSURL URLWithString:user.profile_image_url] placeholderImage:[UIImage imageWithName:@"avatar_default_small"]];

今天说说SDWebImage具体为我们做了哪些事:

1.调用setImageWithURL:placeholderImage:会先把placeholderImage显示。然后SDWebImageManager根据用户提供的URL开始处理图片。

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

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

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

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

6.根据URLKey在硬盘缓存目录下尝试读取图片文件。

7.如果步骤6从硬盘中读取到了图片,将图片添加到内存缓存中(如果空闲内存过小,会先清空内存缓存)。SDImageCacheDelegate回调imageCache:didFindImage:forkey展示图片。

8.如果从硬盘缓存目录中读取不到图片,说明所有缓存都不存在该图片,需要下载图片,回调imageCache:didNotFindImageForkey.

9.共享或重新生成一个下载器SDWebImageDownloader开始下载图片。

10.图片下载由NSURLConnection来完成,利用delegate判断图片下载中、下载完成和下载完成。同时也通过connection:didReceiveData:中利用ImageIO做了按图片下载进度加载效果。

11.connectionDidFinishLoading:图片下载完成后交给SDWebImageDecoder做图片解码处理。

12.图片解码处理在一个NSOperationQueue子线程完成,不会拖慢主线程UI。如果有需要对下载的图片进行二次处理,最好在解码过程完成,效果也会很好。

13.在主线程notifyDelegateOnMainThreadWithInfo:宣告解码完成,imageDecoder:didFinishDecodingImage:userInfo:回调给SDWebImageDownloader。

14.imageDownloader:didFinishWithImage:回调给SDWebImageManager告知图片下载完成。

15.利用通知消息机制告知所有的downloadDelegates下载完成,回调给需要的地方展示图片。

16.将下载的图片保存到SDImageCache中,同时也保存内存缓存和硬盘缓存。写文件到硬盘是单独在NSInvocationOperation完成,避免拖慢主线程。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值