我有一个应用程序,它使用URLSession基于网络的网络并将URLCache网络请求存储在磁盘上。我注意到,当 的存储大小URLCache达到 时diskCapacity,逐出策略似乎是删除所有条目,这在我的用例中是一个问题。因此,我决定编写一个URLCache子类,该子类将为缓存响应提供自定义存储,并通过更好的控制来实现 LRU 驱逐策略。
正如 URLCache 的文档所述,应该支持用于此目的的子类化:
URLCache 类应按原样使用,但当您有特定需要时,您可以对其进行子类化。例如,您可能想要筛选缓存了哪些响应,或者出于安全或其他原因重新实现存储机制。
URLCache然而,我在尝试将这个新子类与网络一起使用时遇到了问题URLSession。
我有一个使用 获取的测试资源HTTP GET。响应标头包含:
Cache-Control: public, max-age=30Etag: <some-value>当使用标准的、非子类化的 时URLCache,第一个请求按预期从网络加载数据(使用 HTTP 代理验证)。如果按预期在前 30 秒内完成,第二个请求不会发送到网络。正如预期的那样,30 秒后的后续请求会导致GET带有 的条件Etag。
使用URLCache子类时,所有请求都会从网络加载数据 - max-age 似乎并不重要,并且不会进行任何条件 GET。
从内部存储加载实例后,似乎会对实例URLCache执行一些特殊操作,这会影响HTTP 缓存逻辑的处理方式。我在这里缺少什么?CachedURLResponseURLSession
我编写了一个非常小的URLCache子类实现来演示这个问题。此类使用/存储和加载CachedURLResponse实例,并且仅支持零个或一个响应。请注意,没有对 super 的调用 - 这是设计使然,因为我想使用自己的存储。NSKeyedArchiverNSKeyedUnarchiver
class CustomURLCache: URLCache {
let cachedResponseFileURL = URL(filePath: …Run Code Online (Sandbox Code Playgroud) AURLRequest允许缓存选项,其中通过设置选项来使缓存数据与源重新验证.reloadRevalidatingCacheData。
文档说:
如果原始源可以验证缓存数据,则使用缓存数据;否则,从原点加载。
我假设验证是通过比较哈希值来进行的,但我没有找到任何对此的参考。
数据如何验证?