Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/95.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 针对图像的内存缓存和磁盘缓存策略_Ios_Xcode_Uitableview_Caching_Image Gallery - Fatal编程技术网

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

Ios 针对图像的内存缓存和磁盘缓存策略,ios,xcode,uitableview,caching,image-gallery,Ios,Xcode,Uitableview,Caching,Image Gallery,现在,我正在开发一个新闻阅读器应用程序,比如BBC新闻iOS。 在我的应用程序中,我必须将图像从服务器下载到,并在视图中显示,以便于用户选择他们想要阅读的新闻 为了获得更好的性能,我必须缓存映像以避免为服务器重新加载映像。 我知道有两种缓存:内存缓存,将图像保存在内存(RAM)中;磁盘缓存,将图像保存在磁盘中,以便在需要时加载 我的问题是: 我的应用程序的最佳图像缓存混合策略是什么?(同时使用内存缓存和图像缓存) 我的解决办法是: 下载映像-->将它们保存在diskcache+将它们保存在内

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

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

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

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

  • 下载映像-->将它们保存在diskcache+将它们保存在内存缓存-->按需从内存缓存加载映像并在视图中显示-->内存缓存超过其最大大小-->内存缓存中的空闲-->按需从磁盘缓存加载映像并将其保存到内存缓存-->重复
我的解决方案是否正确

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

对不起,英语不好。
提前感谢。

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

最大缓存大小

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

对于内存缓存,每个图像的大小计算为
图像大小=图像宽度*图像高度(像素)
因此,内存缓存的最大大小表示像素表面的最大面积

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

腾出空间

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

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

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

到期

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

封装

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

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

不管怎样。。。一、 因为缓存系统的“用户”并不关心幕后发生了什么。我所知道的只是我请求从URL获取一个图像,我得到了它(速度或速度取决于图像是否被缓存)