SDWebImage-图片缓存

作者: 秦砖 | 来源:发表于2017-01-20 15:10 被阅读259次

图片缓存是SDWebImage最重要,最常用的功能。用户浏览过的图片会默认缓存在cache与磁盘上,缓存默认保存一星期时间。也就是说在无网络的环境下,用户依然能够通过缓存查看到一星期之内的已经浏览过的图片。很强大,但是它也是个吃磁盘的怪物,一张图片数据实际上会在磁盘上保存两份,可以想象磁盘可用空间减小的速度有多快。建议使用SDWebImage的开发者给用户提供一个清除缓存的功能,使用户能够及时的清理磁盘,避免App被卸载的悲剧。

SDWebImageManager

SDWebImageManager类是SDWebImage的核心类,它管理着图片的下一步具体行为:

  • 从缓存中查找图片
  • 图片存在,显示图片
  • 图片不存在,下载图片
  • 下载完成后,将图片添加到缓存,显示图片

在这个类中,将图片缓存功能与上一章所说的图片下载功能关联到了一起,构成了SDWebImage的主体图片显示逻辑。

SDImageCache

图片缓存的代码主体类是SDImagaCache,毫无疑问该类的主要代码逻辑就是增、删、查、改等操作。这里我们重点来看下面这几个关键点:

图片标识

缓存图片首先要解决的问题就是通过什么来区分一张张的图片,我们自然而然的会想到图片的URL链接。是的,SDWebImage也是这样干的:


SDWebImageManager获得图片缓存使用的key
SDImageCache保存图片到磁盘使用的名称

与我们设想不同的一点是,它会到图片的URL作MD5运算得到新的文件名,使用该名称来保存图片,避免URL名称过长导致异常。

查询缓存图片

先从cache中查找图片,没有找到再尝试从磁盘中查找。

UIImage* = [self imageFromMemoryCacheForKey:key];
if(image){
  doneBlock(image, SDImageCacheTypeMemory);
  return nil;
}

从磁盘中查找时使用了多线程,因此整个查找方法的返回会为一个NSOperation对象。

NSOperation* operation = [NSOperation new];
dispatch_async(self.ioQueue, ^{
  if(operation.isCancelled){
    return;
  }
  @autoreleasepool{
    UIImage* diskImage = [self diskImageForKey:key];
    if(diskImage && self.shouldCacheImagesInMemory){
      NSUInteger cost = SDCacheCostForImage(diskImage);
      [self.memCache setObject:diskImage forKey:key cost:cost];
    }
    dispatch_async(dispatch_get_main_queue(), ^{
      doneBlock(diskImage, SDImageCacheTypeDisk);
    });
  }
});
return operation;

这里要注意的一点是,ioQueue是一个serial queue,所有对磁盘缓存图片的增、删、改、查操作都被放到这个队列中排队,保证了多线程操作的安全。

吐嘈

不是太喜欢整个工程里全是Block的代码风格,这让我感觉到恐慌。而在OC里面,一但一个环节使用了Block,其后所有环节可能都需要使用,且基本都是在前一环节Block的基础上的进一步封装,很容易就让阅读者陷入困境。有什么好的方案能改进这种情形吗?

相关文章

  • SDWebImage-图片缓存

    图片缓存是SDWebImage最重要,最常用的功能。用户浏览过的图片会默认缓存在cache与磁盘上,缓存默认保存一...

  • SDWebImage-图片自动缓存、异步加载实用库

    SDWebImage是一个可以自动管理图片加载的类库。 因为大家都知道,图片加载非常耗流量,所以在移动平台上对于图...

  • 架构&框架

    图片缓存 怎样设计一个图片缓存框架 图片管理者模块:内存缓存模块、磁盘缓存模块、网络图片下载模块 图片处理:图片解...

  • 区分SDWebImage的三种缓存

    SDWebImage的三种缓存分为:内存图片缓存、磁盘图片缓存、内存操作缓存步骤如下1、先查看内存图片缓存,内存图...

  • 多线程03

    SDWebImage框架详解 下载图片并显示: 下载图片/显示图片/内存缓存/磁盘缓存 下载图片\内存缓存\磁盘缓...

  • Android常用开源工具库

    一、图片缓存 Android-Universal-Image-Loader图片缓存,目前使用最广泛的图片缓存,支持...

  • iOS编程之缓存清除以及文件操作等

    1,SDWebImage图片缓存 这里简单讲解以下SDWebImage图片缓存大小计算以及清理缓存的方法 获取图片...

  • Kingfisher清理缓存功能

    我们使用开源项目Kingfisher来实现图片缓存功能。计算图片缓存和清理图片缓存也是通过Kingfisher来实...

  • SDImageCache

    SDImageCache提供了对图片的内存缓存、异步磁盘缓存、图片缓存查询等功能,下载过的图片会被缓存到内存,也可...

  • 6 单图缓存+刷新

    单张图片缓存思路先把图片缓存到本地,再获取图片大小 (GCD调度组监听下载完成) 单张图片缓存进入加载微博列表视图...

网友评论

    本文标题:SDWebImage-图片缓存

    本文链接:https://www.haomeiwen.com/subject/lvuwbttx.html