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 中,内存缓存和硬盘缓存同一时候保存。写文件到硬盘也在以单独 NSInvocationOperation 完毕,避免拖慢主线程。
18.SDImageCache 在初始化的时候会注册一些消息通知,在内存警告或退到后台的时候清理内存图片缓存。应用结束的时候清理过期图片。
19.SDWI 也提供了 UIButton+WebCache 和 MKAnnotationView+WebCache,方便使用。
20.SDWebImagePrefetcher 能够预先下载图片,方便兴许使用。
SDWebImage库的作用
通过对UIImageView的类别扩展来实现异步载入替换图片的工作。
主要用到的对象:
1、UIImageView (WebCache)类别。入口封装。实现读取图片完毕后的回调
2、SDWebImageManager,对图片进行管理的中转站,记录那些图片正在读取。
向下层读取Cache(调用SDImageCache),或者向网络读取对象(调用SDWebImageDownloader) 。
实现SDImageCache和SDWebImageDownloader的回调。
3、SDImageCache。依据URL的MD5摘要对图片进行存储和读取(实现存在内存中或者存在硬盘上两种实现)
实现图片和内存清理工作。
4、SDWebImageDownloader,依据URL向网络读取数据(实现部分读取和全部读取后再通知回调两种方式)
其它类:
SDWebImageDecoder。异步对图像进行了一次解压??
1、SDImageCache是怎么做数据管理的?
SDImageCache分两个部分。一个是内存层面的,一个是硬盘层面的。内存层面的相当是个缓存器,以Key-Value的形式存储图片。当内存不够的时候会清除全部缓存图片。用搜索文件系统的方式做管理,文件替换方式是以时间为单位,剔除时间大于一周的图片文件。当SDWebImageManager向SDImageCache要资源时,先搜索内存层面的数据,假设有直接返回,没有的话去访问磁盘。将图片从磁盘读取出来。然后做Decoder,将图片对象放到内存层面做备份,再返回调用层。
2、为啥必须做Decoder?
由于UIImage的imageWithData函数是每次绘图的时候才将Data解压成ARGB的图像,所以在每次绘图的时候,会有一个解压操作,这样效率非常低,可是仅仅有瞬时的内存需求。为了提高效率通过SDWebImageDecoder将包装在Data下的资源解压。然后画在另外一张图片上。这样这张新图片就不再须要反复解压了。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-76693-12.html