AFNetworking кеширование с использованием ETag

У меня проблема с реализацией кэширования с использованием значений AFNetworking и ETag. Мой сервер возвращает значения заголовков Cache-Control и ETag для каждого запроса. Но если я сделаю второй запрос на тот же ресурс, AFNetworking не добавит ETag. Должен ли я вручную сохранять etag для каждого полученного ответа и добавлять его к следующим запросам?

В приложении делегат я установил объект кеша:

 NSURLCache *URLCache = [[NSURLCache alloc] initWithMemoryCapacity:20 * 1024 * 1024 diskCapacity:20 * 1024 * 1024 diskPath:nil];
 [NSURLCache setSharedURLCache:URLCache];

Кроме того, я использую политику кэширования по умолчанию AFHTTPRequestSerializer.

Есть идеи, в чем проблема? Может быть, я не понимаю идею кэширования http. Насколько я знаю, он должен быть прозрачным, и все, что мне нужно сделать, это присоединить заголовки ETag и Cache-Control для каждого ответа.

РЕДАКТИРОВАТЬ:

Заголовки ответа выглядят так:

"Cache-Control" = "max-age=3600";
"Content-Encoding" = gzip;
"Content-Type" = "application/json; charset=utf-8";
Date = "Wed, 05 Aug 2015 07:52:33 GMT";
Etag = "W/f6c8a0f47deb7db0eeea3069061de9ab";
Expires = "Wed, 05 Aug 2015 08:52:30 GMT";
"Last-Modified" = "Wed, 05 Aug 2015 08:52:30 GMT";
Server = "cloudflare-nginx";
Vary = "Accept-Encoding";
"cf-ray" = "2110ec564bde0afc-WAW";
"x-cache-id" = "api_3447fddb8680ed5d082ae871e95214dc";
"x-powered-by" = "PHP/5.5.19";
"x-whom" = "www-stage02-b"

1 ответ

Чтобы проверить, исходит ли ваша AFHTTPRequestOperation из кэша или нет, вы можете использовать этот код:

- (AFHTTPRequestOperation *)HTTPRequestOperationWithRequest:(NSURLRequest *)request
                                                    success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
                                                    failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure
{
    NSMutableURLRequest* mutableRequest = [request mutableCopy];
    BOOL __block responseFromCache = YES;

    AFHTTPRequestOperation* operation = [super HTTPRequestOperationWithRequest:mutableRequest
    success:^(AFHTTPRequestOperation *operation, id responseObject)
    {
        NSString* source = responseFromCache ? @"CACHE" : @"SERVER";
        NSLog(@"Request from %@", source);
        success(operation, responseObject);
    }
    failure:nil];

    [operation setCacheResponseBlock:
     ^NSCachedURLResponse *(NSURLConnection *connection, NSCachedURLResponse *cachedResponse) {
         responseFromCache = NO;
         return cachedResponse;
     }];

    return operation;
}

Убедитесь, что вы также включили NSURLCache, когда ваше приложение запускается.

NSURLCache *URLCache = [[NSURLCache alloc] initWithMemoryCapacity:5 * 1024 * 1024
                                                     diskCapacity:50 * 1024 * 1024
                                                         diskPath:nil];
[NSURLCache setSharedURLCache:URLCache];
Другие вопросы по тегам