SDWebImage 面试小结

352 阅读3分钟

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];