【问题标题】:Clear three20 & Restkit cached information to free disk memory space清除three20 & Restkit缓存信息以释放磁盘内存空间
【发布时间】: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 的确切位置以及我应该在哪里清除其中的信息。

任何线索将不胜感激。

【问题讨论】:

    标签: iphone cocoa-touch three20


    【解决方案1】:

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

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

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

    【讨论】:

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

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

    1. 仅针对您不再希望在沙箱中缓存信息的节点有选择地清除 Three20 缓存文件(来自https://stackoverflow.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"];

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

      [[RKClient sharedClient].requestCache invalidateAll];
      
    3. 清除 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”文件中。对此有任何想法吗?
    猜你喜欢
    • 2022-12-20
    • 1970-01-01
    • 1970-01-01
    • 2015-10-01
    • 2019-07-26
    • 2016-06-12
    • 2017-11-19
    • 1970-01-01
    • 2019-08-11
    相关资源
    最近更新 更多