【发布时间】:2021-09-22 03:41:18
【问题描述】:
我正在尝试在 Alamofire 的 ResponseCacher 的帮助下缓存 JSON 响应 (https://api.github.com/search/repositories),在客户端中的有效期为 2 小时。在one of the posts in SO,Alamofire 的 Jon 建议修改 ResponseCacher 中的 CachedURLResponse。响应没有 Cache-Control 或任何缓存标头。所以我在响应中手动添加了缓存控制标头。根据我的理解,我还整理了会话配置代码,但是我似乎无法让缓存与覆盖的到期时间一起工作。会话定义如下:
let sessionConfiguration = URLSessionConfiguration.af.default
sessionConfiguration.requestCachePolicy = .useProtocolCachePolicy
sessionConfiguration.urlCache = URLCache(memoryCapacity: 20 * 1024 * 1024, diskCapacity: 100 * 1024 * 1024)
let responseCacher = ResponseCacher(behavior: .modify { _, response in
return CachedURLResponse(
response: response.response,
data: response.data,
userInfo: userInfo,
storagePolicy: .allowed)
.response(with: 7200)
})
let aSession = Session(configuration: sessionConfiguration, cachedResponseHandler: responseCacher)
其中响应修饰符定义如下
extension CachedURLResponse {
func response(with expirationDuration: Int) -> CachedURLResponse {
var cachedResponse = self
if let httpResponse = cachedResponse.response as? HTTPURLResponse, var headers = httpResponse.allHeaderFields as? [String : String], let url = httpResponse.url{
headers["Cache-Control"] = "private, max-age=\(expirationDuration)"
headers.removeValue(forKey: "Expires")
headers.removeValue(forKey: "s-maxage")
if let newResponse = HTTPURLResponse(url: url, statusCode: httpResponse.statusCode, httpVersion: "HTTP/1.1", headerFields: headers) {
cachedResponse = CachedURLResponse(response: newResponse, data: cachedResponse.data, userInfo: headers, storagePolicy: cachedResponse.storagePolicy)
}
}
return cachedResponse
}
}
如果我将 requestCachePolicy 设置为.useProtocolCachePolicy,当网络离线时,我不会得到任何缓存响应。如果我将 requestCachePolicy 设置为.returnCacheDataElseLoad,则缓存永不过期。我需要缓存我的响应,但也要让它在 2 小时后过期,并在网络离线时返回缓存的响应。
我是缓存方面的初学者,所以有些地方我在没有完全理解它是如何工作的情况下取得了一些飞跃。部分代码取自 SO。
【问题讨论】: