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!")
      }
    }
  }
}