您的位置:首页 > 其它

SDWebImage内部实现过程

2015-11-15 21:31 309 查看
第三方开源在给我们带来便利的同时也会让我们偷懒,不去真真理解其中的原理。平时项目开发中,经常我们会涉及到图片的下载,可能我们对下面的代码的并不陌生:
[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在初始化的时候会注册一些消息通知,在内存警告或退到后台的时候清理内存图片缓存,应用结束的时候清理过期图片。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息