Alamofire 4: принудительно сохранять ответ и извлекать его снова из дискового кэша - PullRequest
0 голосов
/ 19 марта 2020

Я работаю с 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!")
    }
  }
}

Он выполняет запрос, и я получаю "СДЕЛАНО!" Ответ очень хороший, но он все равно занимает много много секунд, даже когда я запускаю функцию getData несколько раз. Почему он не сразу возвращает кэшированный ответ?

Ответ имеет заголовок Cache-Control со значением private,max-age=31536000.

Я использую Alamofire 4.9.1.

1 Ответ

0 голосов
/ 20 марта 2020

Я думаю, что нашел ответ. По крайней мере, это работает. Итак, я ожидал, что запрос автоматически вернет кэшированные данные, если он там есть, но кажется, что он не работает так? Но я могу вручную проверить содержимое кеша ...

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