内存缓存和DiskCache for Images策略

时间:2012-06-29 03:24:47

标签: ios xcode uitableview caching image-gallery

现在,我正在开发像BBC新闻iOS这样的新闻阅读器应用程序。 see in BBC News

在我的应用中,我必须从服务器下载图像并在视图中显示,以便用户更容易选择他们想要阅读的新闻。

为了获得更高的性能,我必须缓存图像以避免为服务器重新加载图像。 我知道有两种缓存:内存缓存将图像保存在内存(RAM)中,DiskCach将图像保存在磁盘中,以便在需要时加载它。

我的问题是: 什么是我的应用程序缓存混合策略的最佳图像? (使用内存缓存和图像缓存) 我的解决方案是:

  • 下载图片 - >将它们保存在diskcache中并将它们保存在内存缓存中 - >根据需要从内存缓存加载图像并在视图中显示---> MAX_SIZE上的内存缓存 - >免费的内存缓存--->根据需要从磁盘缓存加载映像并将其保存到内存缓存 - >重复........

我的解决方案是正确的方法吗?

另一个问题:当内存缓存超过其MAX_SIZE时 - >我们将释放它的 - >缓存中的所有图像都将丢失,因此我们视图中的图像将消失。 - >如何解决这个问题?

抱歉英语不好。 提前谢谢。

1 个答案:

答案 0 :(得分:3)

在我的一个项目中,我实现了几乎相同的缓存方法(磁盘缓存和内存缓存)。

最大缓存大小

每个缓存系统都有自己的最大大小限制。每个图像的“大小”在缓存系统中的计算方式不同。

对于内存缓存,每个图像的大小都计算为 image size = image width * image height (in pixels) 因此,内存高速缓存的最大大小将代表像素表面的最大区域

对于磁盘缓存,我使用了每个文件的实际文件大小。

腾出空间

使用缓存系统时,您可能会遇到其中一个缓存已满并且您想在其中插入新项目的情况 - 您必须删除一些项目才能腾出空间。

我所做的是为缓存中的每个条目分配一个时间戳。每次我访问该项目时,我都会更新时间戳。当您想腾出空间时,您只需根据上次访问时间戳开始从最旧到最新的项目中删除。

这是一种释放空间的简单算法,在某些情况下可能实际上表现不佳。您需要进行实验,看看是否需要比此更先进的东西。 例如,您可以通过为每个项添加优先级值来改进此方法,并在优先级较高时将旧项保留在缓存中。 同样,这取决于您的应用程序的需求。

<强>过期

对于磁盘缓存,我肯定会为每个条目添加一个到期日期。如果在用户完全终止应用程序时销毁内存缓存,则磁盘缓存中的图像可能永远停留在那里。

<强>封装

我要考虑的另一个方面是使缓存系统尽可能透明给程序员。如果要启用/禁用其中一个缓存,最好让大部分代码保持不变。

在我的应用程序中,我构建了一个中央内容传送系统,我总是通过此对象从Internet请求图像。然后,缓存系统将检查本地缓存(内存/磁盘),并立即返回图像或发出下载请求。

无论哪种方式......我,因为缓存系统的“用户”并不关心窗帘背后发生了什么。我所知道的只是我提出了从URL获取图像的请求,我得到了它(更快或更慢,具体取决于图像是否被缓存)。