我已经问过When exactly do things get removed from urlcache's memory and disk?
现在我还有其他后续问题:
内存缓存受iPhone的ram(通常为2Gb)限制。但是磁盘的持久性受到64Gb或128Gb的限制。正确吗?
拥有持久性比存储存储有意义吗?如果您不想占用大量内存(并且不希望应用从挂起状态终止),即允许从磁盘存储中还原缓存,然后返回持久结果,是否有用?
在控件上单击URLCache.shared
后,我看到以下注释:
- 内存容量:4兆字节(4 * 1024 * 1024字节)
- 磁盘容量:20兆字节(20 * 1024 * 1024字节)
- 磁盘路径:
(user home directory)/Library/Caches/(application bundle id)
没有特殊缓存要求或约束的用户 应该找到可接受的默认共享缓存实例。如果这 默认共享缓存实例不可接受,
+setSharedURLCache:
可以调用以设置要返回的其他NSURLCache
实例 从这种方法。呼叫者应注意确保设置者 在没有其他调用者引用该调用者的时间被调用 先前设置的共享URL缓存。这是为了防止存储缓存数据 变得不可思议。
所以我认为我的理由是正确的。
读取/写入/还原缓存的整个过程如何工作?
我的意思是,当我第一次发出网络请求时,是整个响应/错误/数据被写入 /存储在缓存中,然后持久化吗?
下次,如果我想阅读,那么它首先从缓存开始,然后,如果响应不是陈旧/过期,它将返回它。磁盘存储没有任何变化。
如果已过期,则仅在 获得成功的响应后,它将清除内存和磁盘中的响应,并将新响应写入缓存和磁盘中。如果新 请求失败,则不会清除,而只会保留 陈旧/过期的数据,因此如果我们想要(加载过期的响应) 会从那里加载吗?
当应用终止时,内存被清空。除非设备内存不足或达到大小限制,否则磁盘存储将保持不变。下次启动应用程序时,内存会将磁盘存储中的所有内容重新加载到缓存中。
此缓存还原将开始加载具有 存储,然后移至较旧的数据,直到 达到其大小限制或仅达到存储在其中的项目的末尾 磁盘。对吧?
我之所以问所有这些问题,是因为我想改善应用程序的缓存体验并提高我的整体了解,因此我不会过多增加应用程序的内存使用率*,因此不会被冲走。由于我的应用程序内存使用率过高或需要其他应用程序,因此内存从挂起状态开始运行。
*:我们的某些网络请求将下载缩略图,因此在增加缓存大小限制时需要体谅。
答案 0 :(得分:2)
如果您想深入了解内存管理,则应深入了解较低级别的API。 URLSession,URLCache等是非常高级的API。关于内存帧,图像缓存,网络缓存等,有很多WWDC会话。每个部分都有很多说明。我建议您观看所有WWDC视频(如果没有的话)以进行启动和热身。一些主题对此类核心概念有很好的解释。
从今年的WWDC中查看以下两项:
Image and Graphics Best Practices
我们可以坐在这里讨论您的问题几个星期!但为了快速回答:
压缩数据临时移至磁盘,以在内存中为最近使用的数据腾出空间
但是内存在其帧中拥有自己的缓存。有时缓存会降低性能而不是提高性能。因为它是框架。
并非总是如此。默认情况下,仅成功请求将被缓存(如果服务器未请求客户端在标头中“不对其进行缓存”)。但是,您可能知道,URLSession具有大量配置,可以在非常高级的API中对磁盘,内存等进行缓存。请参阅URLSession文档。
请参阅 NSURLRequestCachePolicy 文档。而this是一个很好的教程。 根据您选择的策略,它的行为有所不同,可以清除先前的缓存或将其保留到下一次成功。
HomeDirectory 包含一些主目录。 iOS的行为各不相同。 iOS只会清理 tmp 目录(磁盘缓存所在的目录)。您可以将缓存存储在其他目录中,例如 Documents ,以防止iOS将其删除。但是重点是 cache 单词本身的含义。
根据实际需要分配更少的空间甚至更多的空间都是至关重要的。它可能会破坏进程或浪费内存/磁盘。还记得链接列表发明的原因吗?您可以具有用于不同用途的不同缓存,例如图像和JSON。但是关于图片的重点是:
这些都是Foundation框架的核心,所有已知的第三方都只是它们的包装。因此,它们唯一的好处是:基于数千位贡献者的知识和更高级别的API的预定义默认值。
Alamofire和Kingfisher是很好的例子。
结论
正确的缓存大小取决于用例。取决于数据变量的数量,图像数量,每个图像的大小,访问同一图像的频率等,例如,如果您不断更改缓存中的图像,则实际上可能会对电池寿命产生不利影响!决定合适的缓存大小的最佳方法是进行测试。在“仪器”下运行该应用程序以测量性能和电池使用情况。继续增加缓存大小,直到无法分辨出性能差异。至少在测试条件下,这是您所需的最大尺寸。然后减小尺寸,直到性能勉强可以接受为止,以确定最小的可接受尺寸。正确的尺寸介于这两个尺寸之间,具体取决于您认为重要的东西。