2011-10-26 185 views
1

我正在研究一个具有新闻提要的iPhone应用程序。这条新闻来自我写的JSON网络服务(目前居住在笔记本电脑上的MAMP上)。清除SDWebImage缓存

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

我把它们存储在一个非常特殊的方式,这是我如何存储他们:

全部图片:ng_(postid)_(seqid)
大拇指:tng_(postid)_(seqid)

帖子ID是唯一的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个图像,与7

它的图像的帖子ID可能是这样的:

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的缓存,或使其显示缓存版本后检查服务器?

回答

0

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

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

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

一个先进的解决方案将使用RestKit和核心数据,这将允许用户脱机浏览您的文章,并在您的网络资源(JSON)更改时更新内容(图像,文本)。

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

+0

谢谢。最初我打算设计它,以便使用MySQL自动递增的ID。问题是如何“预测”它会产生的下一个ID。 ATM我使用以下查询'SELECT max(postid)FROM TABLE;'然后增加下一个插入,但我知道这不是MySQL如何做。 MySQL将始终生成比之前生成的高一个数字,而不是比表中的数据高一个。如果你可以告诉我如何预测下一个MySQL ID可以解决这个问题:) –

+0

我需要计算下一个ID btw的原因是,我可以在插入数据库之前使用它来命名我的文件 –

+0

OK I 'm使用http://stackoverflow.com/questions/2251463/mysql-php-how-to-get-auto-increment-field-value-before-inserting-data/2251486#2251486获得下一个ID(带有事务),并且我使用uniqid()生成末尾 –