用于图像策略的内存缓存和 DiskCache

Hoa*_* Ha 5 xcode caching image-gallery uitableview ios

现在,我正在开发一个新闻阅读器应用程序,例如 BBC 新闻 iOS。 参见 BBC 新闻

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

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

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

  • 下载图像 --> 将它们保存在磁盘缓存中 + 将它们保存在内存缓存中 --> 按需从内存缓存中加载图像并在视图中显示 ---> 内存缓存超过其 MAX_SIZE --> 释放内存缓存---> 按需从磁盘缓存加载图像并将其保存到内存缓存 --> 重复........

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

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

抱歉英语不好。预先感谢。

And*_*scu 3

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

最大缓存大小

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

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

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

腾出空间

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

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

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

到期日

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

封装

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

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

不管怎样......我作为缓存系统的“用户”并不关心幕后发生的事情。我只知道我发出了从 URL 获取图像的请求,并且我得到了它(更快或更慢取决于图像是否被缓存)。