【问题标题】:Clear SDWebImage Cache清除 SDWebImage 缓存
【发布时间】:2011-12-15 16:36:45
【问题描述】:

我正在开发一个具有新闻提要的 iPhone 应用程序。此新闻提要是从我编写的 JSON Web 服务中提取的(目前在我笔记本电脑上的 MAMP 上)。

无论如何,我使用 MySQL 数据库来存储对我的图像的引用,这些图像存储在 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

到目前为止,这一直很好,但我想看看如果我删除了一个帖子,然后在原来的位置重新创建一个会发生什么?

假设我们有一个名为“旧帖子”的帖子,它有 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 的缓存,或者在显示缓存版本后让它检查服务器?

【问题讨论】:

    标签: iphone json image caching sdwebimage


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 谢谢。最初我打算设计它以便它使用 MySQL 自动递增的 ID。问题是如何“预测”它将生成的下一个 ID。 ATM 我正在​​使用以下查询SELECT max(postid) FROM TABLE;,然后将其递增以进行下一次插入,但我知道这不是 MySQL 的做法。 MySQL 总是会生成比它之前生成的高一个,而不是比表中的数据高一个。如果你能告诉我如何预测下一个能解决这个问题的 MySQL ID :)
    • 我必须计算下一个 ID btw 的原因是我可以在插入数据库之前使用它来命名我的文件
    • 好的,我正在使用stackoverflow.com/questions/2251463/… 获取下一个 ID(带有事务),并且我正在使用 uniqid() 最后生成位
    • 我没有看到在 SDWebimage 中声明的方法 'removeImageForKey:'。如何使用这种方法?
    猜你喜欢
    • 1970-01-01
    • 2012-12-14
    • 2017-02-14
    • 1970-01-01
    • 1970-01-01
    • 2018-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多