清除SDWebImage缓存

时间:2011-10-26 12:20:18

标签: iphone json image caching sdwebimage

我正在开发一款带有新闻Feed的iPhone应用。这个新闻源是从我写的JSON Web服务中提取的(目前在我的笔记本电脑上的MAMP上运行)。

无论如何,我使用MySQL DB存储对我的图像的引用,这些图像存储在apache文件系统中。

我以非常特殊的方式存储它们,这就是我存储它们的方式:

完整图片:ng_(postid)_(seqid)
拇指:tng_(postid)_(seqid)

PostID是分配给每个新闻帖子的唯一ID SeqID是一个ID,仅对该新闻帖的照片是唯一的。

我可能没那么清楚......例如:

第一篇文章中的图片文件可能如下所示

ng_1_1.jpg
ng_1_2.png
ng_1_3.jpg

第二篇文章的图片文件可能如下所示

ng_2_1.jpg
ng_2_2.png
ng_2_3.gif

到目前为止,这已经很好用了,但我试着看看如果我删除一个帖子会发生什么,并在其中重新创建一个帖子?

假设我们有一个名为'Old Post'的帖子,其中有2张图片,其后缀为7。

它的图像可能如下所示:

ng_7_1.jpg
ng_7_2.jpg

假设我们删除了该帖子,之后创建了一个新帖子,其中有三个图片,称为“新帖子”。

它的图像将如下所示:

ng_7_1.jpg
ng_7_2.jpg
ng_7_3.jpg

现在,问题出现了......如果设备查看了已删除的旧帖子,然后查看了这个新帖子,他们会看到前两张图片来自OLD POST。不是新的。

为什么呢? SDWebImage认为因为URL是相同的,因此决定从磁盘中提取缓存的图像。它甚至不显示缓存版本,然后检查图像是否已更新。

所以,我已经找到了两种可能的解决方案:

  1. 在显示缓存版本
  2. 后,以某种方式让SDWebImage检查在线图像
  3. 传递我的JSON中的密钥,告诉我的应用程序擦除SDWebImage的缓存(必要时)
  4. 所以,我的问题是,您将如何删除SDWebImage的缓存,或者在显示缓存版本后检查服务器?

1 个答案:

答案 0 :(得分:0)

我认为您的PostID值在您的系统中不是唯一的,这会导致您遇到问题。如果您有唯一的PostID值,则无法删除具有给定ID的帖子并将该ID值分配给新帖子...
在我看来,PostID不应该是可重复使用的 - 你能想象一个职员在他的系统中删除一个特定的订单,创建一个具有旧ID的新订单,并且有一天从客户接到一个提供他的订单ID的电话,该订单ID现在被覆盖在系统中?

其他的事情是你永远不应该删除客户端的缓存图像 - 用户友好,节省带宽和用户的数据计划(检查这个link为什么重要)。但是,您可以为SDWebImage指定cacheMaxCacheAge以清除旧的未使用的图像。您还可以使用removeImageForKey:删除特定图片,例如用户决定删除其设备上的特定帖子。

最后,您描述的案例更多与更新特定帖子有关,因此帖子可以获得不同的图像集。在这种情况下,您可以做的最简单的事情是使用唯一的图像ID,因此当下载帖子时,将下载新图像(当缓存达到其最大年龄时将删除旧图像 - 查找cacheMaxCacheAge)。或者,您可以在DB / JSON中引入一种同步机制(例如,基于时间戳:如果下载帖子并且具有比存储在应用程序缓存中的帖子更新的时间戳,则删除旧资源并下载新图像,文本,等等......如果时间戳相等,那么你已经下载的数据就好了。

高级解决方案将使用RestKit和核心数据,这将使用户能够离线浏览您的帖子,并在您的网络资源(JSON)发生变化时更新内容(图片,文本)。

什么是书信......我只希望我的评论对你有用:)