example ios json caching afnetworking afnetworking-2

example - afnetworking ios



AFNetworking: no almacenar en caché la respuesta (8)

Lo que está experimentando es el efecto de la caché de URL (vea NSURLCache ).

El comportamiento de caché de la solicitud se puede definir estableciendo una "Política de caché" para el objeto NSMutableURLRequest , por ejemplo:

NSMutableURLRequest* request = ...; [request setCachePolicy: myCachePolicy];

El comportamiento de almacenamiento en caché predeterminado ( NSURLRequestUseProtocolCachePolicy ) es apropiado para el protocolo actual, que es HTTP. Y para el protocolo HTTP, ¡las solicitudes GET se almacenarán de forma predeterminada!

¡Y AFNetworking no cambia el comportamiento predeterminado de la solicitud!

Ahora, puede establecer otra política de caché, por ejemplo:

NSURLRequestReloadIgnoringLocalCacheData

Especifica que los datos para la carga de URL se deben cargar desde la fuente de origen. No se deben usar datos de caché existentes para satisfacer una solicitud de carga de URL.

Este es probablemente el comportamiento deseado que desea lograr:

[request setCachePolicy: NSURLRequestReloadIgnoringLocalCacheData];

El problema aquí es que la API súper "conveniente" no proporciona una forma de configurar el comportamiento de la caché de URL de la solicitud. No puede acceder a la solicitud utilizada en absoluto.

Por lo tanto, sugeriría utilizar una API de nivel inferior donde tenga control sobre el objeto NSMutableURLRequest creado, y configure la política de caché en consecuencia.

Estoy usando este código para obtener un simple feed JSON de un servidor:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; manager.responseSerializer = [AFJSONResponseSerializer serializer]; [manager GET:kDataUrl parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"response: %@", responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"JSON DataError: %@", error); }];

Funciona. Sin embargo, después de cambiar el archivo JSON en kDataUrl y verificar que el cambio se realiza en un navegador, cuando vuelvo a ejecutar la aplicación, sigo recibiendo la respuesta anterior.

Parece que AFNetworking de alguna manera está guardando en caché la vieja respuesta. No quiero este comportamiento Quiero descargar el feed actual. ¿Hay algún tipo de ajuste o parámetro que deba configurar para desactivar el almacenamiento en caché?


No me siento bien al respecto, pero esto es lo que funciona. En AppDelegate didFinishLaunchingWithOptions:

NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil]; [NSURLCache setSharedURLCache:sharedCache];


En resumen, defina su administrador AFNetworking:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; [manager.requestSerializer setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];

¡Disfrutar!


Solo haz:

manager.requestSerializer.cachePolicy = NSURLRequestCachePolicyReturnCacheDataElseLoad


Para Swift poeple

let manager = AFHTTPSessionManager() manager.requestSerializer.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringCacheData


Con AFNetworking 3:

NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration]; sessionConfiguration.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData; AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:baseURL sessionConfiguration:sessionConfiguration];


intente agregar algo de basura al final de su URL (por ejemplo, marca de tiempo)

kDataUrl = [NSString stringWithFormat:@"%@?%f", kDataUrl, [NSDate timeIntervalSinceReferenceDate]];

En este caso, solicitaría datos nuevos cada vez. Funciona para mi))


AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; [manager.requestSerializer setValue:@"no-store" forHTTPHeaderField:@"Cache-Control"]; [manager.requestSerializer setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];

Agregar el Cache-Control:no-store encabezado Cache-Control:no-store de la solicitud, suponiendo que su servidor se implemente correctamente, devolverá una respuesta con el mismo encabezado, lo que deshabilitará la NSURLCache caché de disco NSURLCache para cualquier solicitud que contenga este encabezado.