首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于图像策略的内存缓存和DiskCache

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

Stack Overflow用户
提问于 2012-06-29 03:24:47
回答 1查看 2.3K关注 0票数 4

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

在我的应用程序中,我必须将图片从服务器下载到并显示出来,以便用户更容易地选择他们想要阅读的新闻。

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

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

  • 下载映像->将它们保存在磁盘缓存中+将它们保存在内存缓存中->按需从内存缓存加载映像,并在其MAX_SIZE上显示->内存缓存->空闲内存缓存->按需从磁盘缓存加载图像,并将其保存到内存缓存->重复.

我的解决办法是正确的吗?

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

抱歉英语太差了。提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-23 10:17:12

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

最大缓存大小

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

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

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

制作房间

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

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

这是一个释放空间的简单算法,在某些情况下,它的行为可能会很糟糕。这取决于你去做实验,看看你是否需要更先进的东西。例如,您可以通过为每个项添加一个优先级值来改进此方法,如果旧项的优先级较高,则将其保存在缓存中。同样,这取决于您的应用程序的需求。

Expiration

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

封装

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

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

不管怎样..。我,作为缓存系统的“用户”,并不关心窗帘后面发生了什么。我所知道的就是请求从URL获取图像,然后得到它(取决于图像是否被缓存,速度更快还是更慢)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11255653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档