Я пытался настроить кеш для 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
. Приложение никогда не получает данные из кеша, вы не знаете, почему это происходит?
Спасибо!