iphone - limpiar - AFNetworking: ¿Cómo saber si la respuesta está usando caché o no? 304 o 200
como limpiar mi iphone de archivos basura (3)
No puedo encontrar ninguna respuesta a mi pregunta, puede ser que me esté perdiendo algo ...
Cuando pido una url, necesito saber si la respuesta proviene de la caché o de la red.
¿El código de estado es 304 o 200? (pero AFNetworking
siempre responde 200)
Con ASIHTTPRequest
solía marcar " didUseCachedResponse
" de didUseCachedResponse
, esto fue perfecto.
Creo que encontré una solución para determinar si la respuesta fue devuelta desde el caché o no usando AFNetworking 2.0. Descubrí que cada vez que se devuelve una nueva respuesta del servidor (estado 200, no 304) se cacheResponseBlock
al cacheResponseBlock
que es una propiedad de AFHTTPRequestOperation
. El bloque debe devolver NSCachedURLResponse
si la respuesta debe estar en caché o nula si no debería. De esta manera, puede filtrar respuestas y almacenar en caché solo algunas de ellas. En este caso, estoy almacenando en caché todas las respuestas que provienen del servidor. El truco es que cuando el servidor envía 304 y la respuesta se carga desde el caché, no se llamará a este bloque. 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 no he encontrado ningún problema hasta ahora. Pero, si tiene una idea mejor o alguna objeción en contra de mi solución, ¡no dude en comentar!
Hay una manera de especificar los códigos de estado que deben considerarse exitosos en la red de AF, esto se hace a través de la serialización 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.
Parece que Apple no quiere que sepas si viene de caché o no.
Encontré una forma al guardar la fecha de modificación asociada con la solicitud, y comparo esta fecha cuando AFNetWorking me responde.
No tan limpio como pretendo, pero funciona ...