Cómo utilizar NSURLCache para devolver las respuestas de la API en caching cuando está fuera de línea (aplicación de iOS)

Espero que alguien pueda arrojar algo de luz sobre algunas de las cosas que he estado investigando pero que no han progresado mucho.

Me gustaría aprovechar el NSURLCache para devolver las respuestas en caching para las llamadas a API que hago dentro de una aplicación de iOS. Cuando el dispositivo está en línea, me gustaría devolver la respuesta en caching si es lo suficientemente reciente, de lo contrario, puedo getla desde el control remoto. Cuando el dispositivo está fuera de línea, me gustaría devolver inmediatamente la respuesta en caching (si la hay), independientemente de su edad.

Estoy usando AFNetworking . Las llamadas de API que estoy haciendo son a un server que controlo. El protocolo es HTTPS. El encabezado de respuesta de Cache-Control actualmente es "max-age=0, public" . No estoy actualmente configurando los encabezados de request relacionados con el caching (¿debería?). Configuro la política de caching de la request como NSURLRequestReturnCacheDataDontLoad cuando está fuera de línea y uso la NSURLRequestUseProtocolCachePolicy pnetworkingeterminada cuando NSURLRequestUseProtocolCachePolicy en línea. Y puedo ver las requestes y sus respuestas en el Cache.db pnetworkingeterminado en el disco. Sin embargo, cuando estoy desconectado, todas las requestes fallan (no se utilizan / devuelven respuestas en caching (a pesar de que parecen haber sido almacenadas en caching).

Por http://nshipster.com/nsurlcache/ Inicializo un shanetworkingURLCache en didFinishLaunchingWithOptions y establezco el bloque AFNetworking setCacheResponse en algo como esto:

 NSMutableDictionary * mutableUserInfo = [[cachedResponse userInfo] mutableCopy]; 
 NSMutableData * mutableData = [[cachedResponse data] mutableCopy]; 
 NSURLCacheStoragePolicy storagePolicy = NSURLCacheStorageAllowed;
 return [[NSCachedURLResponse alloc] initWithResponse: [cachedResponse response] datos: mutableData userInfo: mutableUserInfo storagePolicy: storagePolicy];

He leído estas y otras publicaciones sobre el tema:

http://petersteinberger.com/blog/2012/nsurlcache-uses-a-disk-cache-as-of-ios5/ http://blackpixel.com/blog/2012/05/caching-and-nsurlconnection.html

Me pregunto si alguien por ahí ha logrado esta funcionalidad con éxito antes de usar el NSURLCache estándar (también interesado en historias de éxito que involucran a SDURLCache pero Peter S. dice que a partir de iOS5 el almacenamiento en caching de disco es compatible, por SDURLCache tanto SDURLCache ya no es necesario, es decir, me gustaría para usar el caching integrado pnetworkingeterminado).

¡Gracias por adelantado!

¿Viste esta publicación?

El modo fuera de línea AFNetworking (AFHttpClient) no funciona con la política NSURLRequestReturnCacheDataDontLoad

Parece que podría ser un error con iOS 6. Esto es lo que Robert Mao tuvo que decir en la publicación:

Un trabajo resumido es leer la respuesta del caching, en lugar de utilizar la política NSURLRequestReturnCacheDataDontLoad:

 NSCachedURLResponse *cachedResponse = [[NSURLCache shanetworkingURLCache] cachedResponseForRequest:request]; if (cachedResponse != nil && [[cachedResponse data] length] > 0) { // Get cached data .... } 

A less que todas sus llamadas sean 100% OBTENIDAS y libres de efectos secundarios o dependencia del time, esto es peligroso.