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.