SDWebImage内部实现过程
2015-11-15 21:31
309 查看
第三方开源在给我们带来便利的同时也会让我们偷懒,不去真真理解其中的原理。平时项目开发中,经常我们会涉及到图片的下载,可能我们对下面的代码的并不陌生:
今天说说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在初始化的时候会注册一些消息通知,在内存警告或退到后台的时候清理内存图片缓存,应用结束的时候清理过期图片。
[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在初始化的时候会注册一些消息通知,在内存警告或退到后台的时候清理内存图片缓存,应用结束的时候清理过期图片。
相关文章推荐
- Enterprise Library for .NET Framework 2.0缓存使用实例
- PowerShell中编程清空IE缓存方法
- PowerShell中使用.NET将程序集加入全局程序集缓存
- VBS字符串的内部实现
- C#中缓存的基本用法总结
- wap开发中如何有效的利用缓存减少消息的传送量
- PHP基于文件存储实现缓存的方法
- smarty缓存用法分析
- 引用全局程序集缓存内的程序集的方法
- asp Response.flush 实时显示进度
- C#实现清除IE浏览器缓存的方法
- ASP.NET缓存管理的几种方法
- PHP文件缓存类实现代码
- 清除aspx页面缓存的程序实现方法
- C#缓存之SqlCacheDependency用法实例总结
- jQuery数据缓存用法分析
- Jquery validation remote 验证的缓存问题解决方法
- IE9下Ajax无法刷新数据的缓存问题解决方法
- Ajax获取页面被缓存的解决方法
- ASP.NET网站管理系统退出 清除浏览器缓存,Session的代码