phoneclean limpiar como cache borrar basura archivos aplicaciones iphone ios asihttprequest afnetworking http-status-code-304

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 ...