SDWebImage源码剖析(二)

SDWebImageCache管理着SDWebImage的缓存,其中内存缓存采用NSCache,同时会创建一个ioQueue负责对硬盘的读写,并且会添加观察者,在收到内存警告、关闭或进入后台时完成对应的处理:

查询图片

每次向SDWebImageCache索取图片的时候,会先根据图片URL对应的key值先检查内存中是否有对应的图片,如果有则直接返回;如果没有则在ioQueue中去硬盘中查找,其中文件名是是根据URL生成的MD5值,找到之后先将图片缓存在内存中,然后在把图片返回:

在硬盘查询的时候,会在后台将NSData转成UIImage,并完成相关的解码工作:

保存图片

当下载完图片后,会先将图片保存到NSCache中,并把图片像素大小作为该对象的cost值,同时如果需要保存到硬盘,会先判断图片的格式,PNG或者JPEG,并保存对应的NSData到缓存路径中,文件名为URL的MD5值:

硬盘文件的管理

在程序退出或者进入后台时,会出图片文件进行管理,具体的策略:

  • 清除过期的文件,默认一星期
  • 如果设置了最大缓存,并且当前缓存的文件超过了这个限制,则删除最旧的文件,直到当前缓存文件的大小为最大缓存大小的一半

总结

  • 接口设计简单
    通常我们使用较多的UIImageView分类:

    一个简单的接口将其中复杂的实现细节全部隐藏:简单就是美。
  • 采用NSCache作为内存缓
  • 耗时较长的请求,都采用异步形式,在回调函数块中处理请求结果
  • NSOperation和NSOperationQueue:可以取消任务处理队列中的任务,设置最大并发数,设置operation之间的依赖关系。
  • 图片缓存清理的策略
  • dispatch_barrier_sync:前面的任务执行结束后它才执行,而且它后面的任务要等它执行完成之后才会执行。
  • 使用weak self strong self 防止retain circle
  • 如果子线程进需要不断处理一些事件,那么设置一个Run Loop是最好的处理方式
1 1 收藏 评论

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部