清除three20 & Restkit缓存信息以释放磁盘内存空间

Posted

技术标签:

【中文标题】清除three20 & Restkit缓存信息以释放磁盘内存空间【英文标题】:Clear three20 & Restkit cached information to free disk memory space 【发布时间】:2013-09-11 16:16:04 【问题描述】:

除了服务器中的图像外,我还下载了几个文件。这些下载的文件使用 TTURLCache 进行缓存。在一段时间内,应用程序消耗的磁盘空间可能会增长。出于同样的原因,应用程序的设置中有一个功能可以选择性地清除缓存的信息。

在of this post 的帮助下,我可以从服务器中删除与 URL 对应的本地磁盘中存储的文件。这将从该沙盒位置清除数据:“Library/Caches/Three20”。

但是,我观察到,如果我切换到离线模式,应用仍然能够拉取远程资源并呈现数据。此外,即使没有互联网连接,它也会将文件添加回“库/缓存/Three20”位置!经过进一步审查,我观察到有一个缓存数据库从其中获取请求:

“库/Caches/com.yourcompany.yourapp/Cache.db” “图书馆/缓存/com.yourcompany.yourapp/Cache.db-shm” "库/Caches/com.yourcompany.yourapp/Cache.db-wal"

一切都很好,所以我测试了除了从“库/缓存/Three20”位置有选择地清除文件之外,我还必须有选择地从数据库中删除数据库条目:“库/缓存/com.yourcompany.yourapp/ Cache.db”、“Library/Caches/com.yourcompany.yourapp/Cache.db-shm”和“Library/Caches/com.yourcompany.yourapp/Cache.db-wal”。

我检查了代码,但我找不到数据写入 Cache.db 的确切位置以及我应该在哪里清除其中的信息。

任何线索将不胜感激。

【问题讨论】:

【参考方案1】:

Cache.db 是 Apple 的 URL 加载系统使用的缓存。没有记录它是如何工作的,但有理由认为这个缓存会自行管理它的大小。

即使您从 Three20 的缓存中删除文件,它们仍然存在于 URL 加载系统缓存中,从那里提供服务,然后读取到 Three20 的缓存中。

在URL Loading System Programming Guide 中了解有关此缓存的更多信息

【讨论】:

是的,你是对的,我还在回答中添加了更多细节。请检查我是否正确。【参考方案2】:

根据 tonklon 的回答和我的更多研究,我知道是 NSURLCache 正在缓存 URL 的响应。图片中还有一个 Restkit 的“永久存储”数据也必须清除。所以以下三个确保我们清除数据(选择性地):

    仅针对您不再希望在沙箱中缓存信息的节点有选择地清除 Three20 缓存文件(来自https://***.com/a/5161356/260665): 它从“Library/Caches/Three20”中清除数据

    [[TTURLCache sharedCache] removeURL:@"http://example.com/an_image.jpg" 从磁盘:是]; [[TTURLCache sharedCache] invalidateURL:@"http://example.com/an_image.jpg"];

    清除 Restkit 缓存:(来自 Restkit 的作者:https://***.com/a/7230083/260665) 它从“Library/Caches/RKClientRequestCache-youapp.com/PermanentStore”和“Library/Caches/RKClientRequestCache-yourapp.com/SessionStore”中清除数据

    [[RKClient sharedClient].requestCache invalidateAll];
    

    清除 NSURLCache 信息。它从“Library/Caches/com.yourcompany.yourapp/Cache.db-wal”(http://twobitlabs.com/2012/01/ios-ipad-iphone-nsurlcache-uiwebview-memory-utilization/)

    中清除数据
    [[NSURLCache sharedURLCache] removeAllCachedResponses];
    NSUInteger originalDiskCapacity = [[NSURLCache sharedURLCache] diskCapacity];
    [[NSURLCache sharedURLCache] setDiskCapacity:0];
    [[NSURLCache sharedURLCache] setDiskCapacity:originalDiskCapacity];
    

【讨论】:

这看起来对我来说是正确的。但是你有没有想过完全禁用 NSURLCache?如果您使用的是 Three20 和 RestKit 的缓存,应该这样做。 我正在清除 NSURLCache 的内容,因为我观察到 NSURLCache 中的所有数据仍然存在。即使我从缓存中删除文件,也没有什么不同,因为所有数据都已缓存。清除 NSURLCache 后,我可以看到所有数据都被删除了。但是,我正在重置“originalDiskCapacity”,这似乎没有任何影响。我观察到数据不再缓存在“Cache.db-wal”文件中。对此有任何想法吗?

以上是关于清除three20 & Restkit缓存信息以释放磁盘内存空间的主要内容,如果未能解决你的问题,请参考以下文章

RESTKit 0.20 - 注销和清除授权标头

如何判断 RestKit v0.20.2 是不是提供了实体缓存的结果?

RestKit 的词法解析器问题

RestKit - 清除数据

RestKit & RKDynamicMapping

如何在restkit映射后和保存到实体之前清除旧实体?