Alamofire 4:强制响应被存储并再次从磁盘缓存中获取
Alamofire 4: force response to be stored and fetched again from disk cache
我使用的 API 有时会很慢,但我知道对于每个唯一 URL,我会 总是 得到相同的 JSON 响应。因此,非常适合永久存储在缓存中,这样至少在您下次打开应用程序时它会立即存在。
看起来很简单,但没有按预期工作。
import Alamofire
class ViewModel {
private let sessionManager: SessionManager
init() {
let configuration = URLSessionConfiguration.default
configuration.requestCachePolicy = .returnCacheDataElseLoad
configuration.urlCache = URLCache(memoryCapacity: 20 * 1024 * 1024, diskCapacity: 200 * 1024 * 1024, diskPath: "cache")
configuration.timeoutIntervalForRequest = 15
sessionManager = Alamofire.SessionManager(configuration: configuration)
}
func getData() {
print("START!")
let url = URL(string: "https://www.example.com/data/2020.json")!
let signature = "ABC"
let request = sessionManager.request(url, headers: ["Signature": signature]).validate()
let task = request.responseJSON { response in
print("DONE!")
}
}
}
它正在执行请求,我得到了 "DONE!" 响应,但它仍然需要很多秒,即使我 运行 getData
函数多次。为什么不立即返回缓存的响应?
响应的 Cache-Control
header 值为 private,max-age=31536000
。
我正在使用 Alamofire 4.9.1。
我想我找到了答案。至少这行得通。所以,我预计请求会自动 return 缓存数据(如果存在),但它似乎不是那样工作的?但是我可以手动查看缓存的内容...
class ViewModel {
private let cache: URLCache
private let sessionManager: SessionManager
init() {
cache = URLCache(memoryCapacity: 20 * 1024 * 1024, diskCapacity: 200 * 1024 * 1024, diskPath: nil)
let configuration = URLSessionConfiguration.default
configuration.requestCachePolicy = .returnCacheDataElseLoad
configuration.urlCache = cache
configuration.timeoutIntervalForRequest = 15
sessionManager = Alamofire.SessionManager(configuration: configuration)
}
func getData() {
let url = URL(string: "https://www.example.com/data/2020.json")!
var urlRequest = URLRequest(url: url)
urlRequest.addValue(signature, forHTTPHeaderField: "Signature")
if let data = cache.cachedResponse(for: urlRequest)?.data {
// Do something with the cached data
} else {
// Do the request
let request = sessionManager.request(urlRequest).validate()
let task = request.responseJSON { response in
print("DONE!")
}
}
}
}
我使用的 API 有时会很慢,但我知道对于每个唯一 URL,我会 总是 得到相同的 JSON 响应。因此,非常适合永久存储在缓存中,这样至少在您下次打开应用程序时它会立即存在。
看起来很简单,但没有按预期工作。
import Alamofire
class ViewModel {
private let sessionManager: SessionManager
init() {
let configuration = URLSessionConfiguration.default
configuration.requestCachePolicy = .returnCacheDataElseLoad
configuration.urlCache = URLCache(memoryCapacity: 20 * 1024 * 1024, diskCapacity: 200 * 1024 * 1024, diskPath: "cache")
configuration.timeoutIntervalForRequest = 15
sessionManager = Alamofire.SessionManager(configuration: configuration)
}
func getData() {
print("START!")
let url = URL(string: "https://www.example.com/data/2020.json")!
let signature = "ABC"
let request = sessionManager.request(url, headers: ["Signature": signature]).validate()
let task = request.responseJSON { response in
print("DONE!")
}
}
}
它正在执行请求,我得到了 "DONE!" 响应,但它仍然需要很多秒,即使我 运行 getData
函数多次。为什么不立即返回缓存的响应?
响应的 Cache-Control
header 值为 private,max-age=31536000
。
我正在使用 Alamofire 4.9.1。
我想我找到了答案。至少这行得通。所以,我预计请求会自动 return 缓存数据(如果存在),但它似乎不是那样工作的?但是我可以手动查看缓存的内容...
class ViewModel {
private let cache: URLCache
private let sessionManager: SessionManager
init() {
cache = URLCache(memoryCapacity: 20 * 1024 * 1024, diskCapacity: 200 * 1024 * 1024, diskPath: nil)
let configuration = URLSessionConfiguration.default
configuration.requestCachePolicy = .returnCacheDataElseLoad
configuration.urlCache = cache
configuration.timeoutIntervalForRequest = 15
sessionManager = Alamofire.SessionManager(configuration: configuration)
}
func getData() {
let url = URL(string: "https://www.example.com/data/2020.json")!
var urlRequest = URLRequest(url: url)
urlRequest.addValue(signature, forHTTPHeaderField: "Signature")
if let data = cache.cachedResponse(for: urlRequest)?.data {
// Do something with the cached data
} else {
// Do the request
let request = sessionManager.request(urlRequest).validate()
let task = request.responseJSON { response in
print("DONE!")
}
}
}
}