1

我正在开发一个有新闻提要的 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 张图片,postid 为 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. 在显示缓存版本后,不知何故让 SDWebImage 检查在线图像
  2. 在我的 JSON 中传递一个键,告诉我的应用程序擦除 SDWebImage 的缓存(必要时)

所以,我的问题是,你将如何删除 SDWebImage 的缓存,或者在显示缓存版本后让它检查服务器?

4

1 回答 1

0

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

另一件事是,您永远不应该在客户端删除缓存的图像 - 对用户友好,节省带宽和用户的数据计划(检查此链接为什么重要)。但是,您可以指定cacheMaxCacheAgeSDWebImage 以删除旧的、未使用的图像。removeImageForKey:例如,当用户决定删除其设备上的特定帖子时,您还可以删除特定图像。

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

高级解决方案将使用RestKit和 Core Data,这将使用户能够在您的 Web 资源 (JSON) 更改时离线浏览您的帖子并更新内容(图像、文本)。

真是一封信……我只是希望我的评论对你有用:)

于 2011-10-26T13:37:39.813 回答