内存缓存和磁盘缓存对于图像的策略

5
现在,我正在开发一个类似于BBC新闻iOS的新闻阅读器应用程序。在BBC News中查看 在我的应用程序中,我必须从服务器下载图像并在视图中显示它们,以使用户更容易选择他们想要阅读的新闻。
为了获得更好的性能,我必须缓存图像以避免从服务器重新加载图像。 我知道有两种缓存:将图像保存在内存(RAM)中的内存缓存和将图像保存在磁盘中的DiskCache以在需要时加载它。
我的问题是: 对于我的应用程序,什么是最佳的混合策略来缓存图像?(同时使用内存缓存和图像缓存) 我的解决方案是:
下载图像-->将它们保存在磁盘缓存中+将它们保存在内存缓存中-->按需从内存缓存中加载图像并显示在视图中--->当内存缓存达到其MAX_SIZE时-->释放内存缓存--->按需从磁盘缓存中加载图像并将其保存到内存缓存中-->重复........ 我的解决方案是否正确?
另一个问题:当内存缓存超过其MAX_SIZE时,我们将释放它的所有图像,因此缓存中的所有图像都将丢失,因此我们视图中的图像也将消失。 如何解决这个问题? 抱歉我的英语不好。 提前感谢您。
1个回答

3
在我的一个项目中,我实现了相似的缓存方法(磁盘缓存和内存缓存)。 最大缓存大小 每个缓存系统都有自己的最大大小限制。在缓存系统中,每个图像的“大小”计算方式不同。
对于内存缓存,每个图像的大小计算为 图像大小=图像宽度×图像高度(以像素为单位) 因此,内存缓存的最大大小代表像素表面的最大面积。
对于磁盘缓存,我使用每个文件的实际文件大小。 腾出空间 使用缓存系统时,可能会出现一个缓存已满并且您想要向其中插入新项的情况 - 您必须删除一些项以腾出空间。
我的做法是为缓存中的每个条目分配一个时间戳。每次访问该项时,我都会更新时间戳。当您要腾出空间时,您只需要从最旧的到最新的根据上次访问时间戳开始删除项目。
这是一种释放空间的简单算法,在某些情况下可能表现得不好。这取决于您是否需要比这更先进的东西。 例如,您可以通过为每个项目添加优先级值来改善此方法,并且如果其优先级高,则保留缓存中的旧项目。 同样,这取决于您的应用程序需求。 过期 对于磁盘缓存,我肯定会为每个条目添加到期日期。如果内存缓存在用户完全终止应用程序时被销毁,则磁盘缓存中的图像可能会永远卡在那里。 封装 我考虑的另一个方面是尽可能使缓存系统对程序员透明。 如果要启用/禁用其中一个缓存,最好将大部分代码保持不变。
在我的应用程序中,我构建了一个中央内容交付系统,我总是通过此对象请求互联网上的图像。然后,缓存系统将检查本地缓存(内存/磁盘),并立即返回图像给我,或者请求下载它。
无论哪种方式......作为缓存系统的“用户”,我都不在意幕后发生了什么。所有我知道的是我发出了从URL获取图像的请求,然后得到了它(速度快或慢,取决于图像是否被缓存)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接