Кэш Alamofire не найден - PullRequest
0 голосов
/ 05 мая 2020

Я пытался настроить кеш для Alamofire 5.0, выполнив приведенную ниже конфигурацию:

private func buildURLCache() -> URLCache {
  let capacity = 50 * 1024 * 1024 // MBs
  #if targetEnvironment(macCatalyst)
  return URLCache(memoryCapacity: capacity, diskCapacity: capacity)
  #else
  return URLCache(memoryCapacity: capacity, diskCapacity: capacity, diskPath: nil)
  #endif
}

private func defaultSessionManager(_ requestInterceptor: RequestInterceptor?) -> Alamofire.Session {

  let evaluators: [String: ServerTrustEvaluating] = [
    "google.com": PinnedCertificatesTrustEvaluator(certificates: pinnedCertificates())
  ]

  // Create custom manager
  let configuration = URLSessionConfiguration.af.default
  configuration.headers = HTTPHeaders.default
  configuration.requestCachePolicy = .useProtocolCachePolicy

  URLCache.shared = buildURLCache()
  configuration.urlCache = URLCache.shared

  return Alamofire.Session(
      configuration: configuration,
      interceptor: requestInterceptor,
      serverTrustManager: ServerTrustManager(evaluators: evaluators))
}

Функция defaultSessionManager(_) возвращает настроенный экземпляр Alamofire, я поместил его как сильную ссылку и выполните такой запрос (не беспокойтесь, это просто пример):

let alamofireManager = defaultSessionManager(nil)

func getFoos(
  token: String,
  completion: @escaping (Result<[Foo], Error>) -> Void) {

  alamofireManager.request(
    "google.com",
    encoding: JSONEncoding.default,
    headers: headers(token))
    .validate()
    .responseJSON { (dataResponse: AFDataResponse<Any>) in

      if let cacheData = URLCache.shared.cachedResponse(for: dataResponse.request!) {
        print("URLCache.shared Data is from cache")
      } else {
        print("URLCache.shared Data is from Server")
      }

      if let cacheData = URLCache.shared.cachedResponse(for: (dataResponse.request?.urlRequest!)!) {
        print("URLCache.shared urlRequest Data is from cache")
      } else {
        print("URLCache.shared urlRequest Data is from Server")
      }

      //....
    }
}

К сожалению, функции URLCache.shared.cachedResponse возвращают nil, в результате чего функция печатает только ... Data is from Server. Приложение никогда не получает данные из кеша, вы не знаете, почему это происходит?

Спасибо!

1 Ответ

1 голос
/ 05 мая 2020

Здесь есть несколько проблем.

Во-первых, в настоящее время response.request возвращает последний URLRequest, который Alamofire видел, что не обязательно является URLRequest, которое было выполнено и вышел по сети. Чтобы увидеть это значение, вам действительно нужно захватить Alamofire Request и проверить его свойство task?.currentRequest. Это должно дать вам URLRequest, которое прошло через Alamofire, и URLSession и было выполнено. Мы планируем сделать эти URLRequest доступными и для ответа.

Во-вторых, если вы просто хотите проверить, получили ли вы кэшированный ответ, лучше проверить значение URLSessionTaskMetrics, так как это должно дать окончательный ответ без необходимости проверять URLCache.

response.metrics?.transactionMetrics.last?.resourceFetchType

Если это значение .localCache, значит, вы знаете, что ваш ответ пришел из кеша.

...