1: SDWebImage
缓存->硬盘->下载 (下载完成以后保存到内存缓存和硬盘缓存中)
1:首先将placeholderImgae进行展示,SDWebImageManger根据URL开始处理图片
2:SDImageCache从缓存中查找图片,如果有SDImageCacheDelegate
回调image: didFindImage:forkey:userinfo: 到SDWebImageManager ,就到前端展示图片
3:缓存中如果没有,那么就生成NSInvocationOperation添加到队列中开始在硬盘中 查找,如果找到,
就会将图片添加到缓存中(如果缓存不够,会先清理) 然后SDImageCacheDelegate回调
imageCache:didFindImage:forkey:userinfo,进行图片展示
4: 如果硬盘中没有生成则共享或生成下载器SDWebImageDownLoader开始下载图片,
图片下载由NSURLConnection来做
5:图片解码处理在一个NSOperationQueue完成,不会拖慢主线程UI,
如果有需要对下载图片进行二次处理,最好也在这里完成,效率会好很多
6:在主线程notifyDelegateOnMainThreadWithInfo: 宣告解码完成
imageDecoder:didFinishDecodingImage:userInfo:回调给SDWebImageDownLoader
imageDownloader:didFinishWithImage:回调给SDWebImageManager告诉图片下载完成
7:通知所有downloadDelegates下载完成,回调给需要的地方展示图片.将图片保存到 SDImageCache中,
内存缓存和硬盘缓存同时保存,写文件到硬盘中也可以在单独NSInvocationOperation中完成,
避免拖慢主线程
8:SDImageCache在初始化的时候会注册一些消息通知,在内存警告或者退到后台的时 候清理内存图片缓存,
应用结束的时候清理过期的图片
SDWebImage数据管理
SDwebImageCache 分两个部分,一个是内存层面的,一个是硬盘层面的
1:内存层面的相当于是个缓存器,以Key-Value的形式存储图片,
当内存不够的时候会清理所有缓存中的图片.用搜索文件系统的方式做管理,文件替换方式是以时间为单位的,
剔除时间大于一周的图片文件.当SDWebImageManager向SDImageCache要资源时,先搜索内存层面的数据,
如果有直接返回,没有的话去磁盘访问,将图片从磁盘读取出来,然后做Decoder,
将图片对象放到内存层面做备份,在返回调用层
2:clearDisk(NSCache)清空磁盘缓存,将所有缓存目录文件,全部删除:实际工作,将 缓存目录直接删除,
再次创建一个同名空目录!cleanDish(接收到应用程序将要终止通) 清理磁盘缓存策略
cleanDish执行过程
1:获取磁盘路径URL,根据路径获取资源(存入NSArray)
2:定义一个可变字典,记录所有缓存文件
3:定义一个可变数组,遍历资源,将过期的文件记录到可变数组里面,
累加文件的总大小,然后遍历过期文件数组删除过期文件
4:如果剩余磁盘缓存控件超出最大限额,再次执行清理操作,删除最早的文件,
循环依次删除文件,知道地域期望的缓存限额,SDWebImage里面的期望限额的一半
SDWebImgae 默认缓存时间是多久
1周
SDWebImage 清除缓存数据
1:cleanDisk: 删除过期的文件数据,计算当前未过期的已经下载文件数据大小,
如果发现该数据大小,大于我们设置的最大缓存数据大小,
那么程序内部就会按照文件数据缓存的时间从远到近删除,直到小于最大缓存数据为止
2:clearMemory:直接删除文件,重新创建的文件夹
2.1:[[SDWebImageManager shareManager].imageCache cleanDisk];
2.2:[[SDWebImageManager shareManager].imageCache clearMemory];