AFNetworking: ¿Cómo saber si la respuesta está utilizando el caching o no? 304 o 200

No puedo encontrar ninguna respuesta a mi pregunta, tal vez extraño algo …

Cuando solicito una URL, necesito saber si la respuesta proviene del caching o de la networking.

¿Es el código de estado 304 o 200? (pero AFNetworking siempre responde 200)

Con ASIHTTPRequest , solía verificar " didUseCachedResponse " de didUseCachedResponse , esto era perfecto.

Creo que encontré una solución para determinar si la respuesta se devolvía desde el caching o si no usaba AFNetworking 2.0. Descubrí que cada vez que se devuelve una nueva respuesta del server (estado 200, no 304), se cacheResponseBlock que es una propiedad de AFHTTPRequestOperation . El bloque debe devolver NSCachedURLResponse si la respuesta debe almacenarse en caching o nula si no debe. De esta forma, puede filtrar las respuestas y almacenar solo algunas de ellas. En este caso, estoy almacenando en caching todas las respuestas que provienen del server. El truco es que cuando el server envía 304 y la respuesta se carga desde el caching, este bloque no se llamará. Entonces, este es el código que estoy usando:

 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; BOOL __block responseFromCache = YES; // yes by default void (^requestSuccessBlock)(AFHTTPRequestOperation *operation, id responseObject) = ^(AFHTTPRequestOperation *operation, id responseObject) { if (responseFromCache) { // response was returned from cache NSLog(@"RESPONSE FROM CACHE: %@", responseObject); } else { // response was returned from the server, not from cache NSLog(@"RESPONSE: %@", responseObject); } }; void (^requestFailureBlock)(AFHTTPRequestOperation *operation, NSError *error) = ^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"ERROR: %@", error); }; AFHTTPRequestOperation *operation = [manager GET:@"http://example.com/" parameters:nil success:requestSuccessBlock failure:requestFailureBlock]; [operation setCacheResponseBlock:^NSCachedURLResponse *(NSURLConnection *connection, NSCachedURLResponse *cachedResponse) { // this will be called whenever server returns status code 200, not 304 responseFromCache = NO; return cachedResponse; }]; 

Esta solución funciona para mí y hasta el momento no he encontrado ningún problema. Pero, si tienes una idea mejor o algunas objeciones contra mi solución, ¡siéntete libre de comentar!

Parece que Apple no quiere que sepas si proviene de la memory caching o no.

Encontré una manera de save la date de modificación asociada con la request, y comparo esta date cuando AFNetWorking me responde.

no tan limpio como pretendo, pero funciona …

Hay una forma de especificar los códigos de estado que deben considerarse éxito en AFNetworking, se hace a través de la serialization de respuestas, aquí está el código

 AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; AFHTTPResponseSerializer *respSerializer = [AFHTTPResponseSerializer serializer]; NSMutableIndexSet *responseCodes = [NSMutableIndexSet indexSet]; [responseCodes addIndex:200]; [responseCodes addIndex:304]; [operation setResponseSerializer:respSerializer]; 

Con este código AFNetworking tratará a 304 como un éxito