UIWebView no siempre llama:

Parece que UIWebView no siempre llama a storeCachedResponse:forRequest: siempre que está cargando un recurso. ¿Alguien sabe por qué? Estoy intentando almacenar en caching imágenes utilizando -[NSURLCache storeCachedResponse:forRequest:] , realiza la mayor parte del trabajo bien, sin embargo, en algunos casos UIWebView no llama a este método en la carga de la página donde realmente hay imágenes.

Como se describe aquí, NSURLConnection no llama a storeCachedResponse:forRequest: si el tamaño del file es superior a 50 kb (52428 bytes).
Prueba el almacenamiento en caching ASIHTTPRequest .

Respondiendo a la consulta del proveedor de recompensas:

Estoy viendo esto para pequeños files (100s de bytes) también. La vista web también no puede llamar a cachedResponseForRequest:

Encontré esta pregunta que aborda este comportamiento directamente:

A pesar de la documentation de Apple que indica lo contrario , NSURLCache en iOS no hace ningún tipo de caching de disco (flash). Puede subclass NSURLCache para cambiar el comportamiento de las operaciones de búsqueda y almacenamiento para usar el disco (como SDURLCache hace SDURLCache ), pero debido a las siguientes limitaciones severas de cómo se usa e implementa el caching, esto no funciona tan bien como usted ' Espero:

  • NSURLConnection ni siquiera llama a storeCachedResponse:forRequest: para files de más o less 50 KB (> = 52428 bytes, para ser exactos). Esto hace innecesarias las subclasss NSURLCache para nuestro uso (imágenes de 200KB), ya que ni siquiera llegará al caching. Como resultado, tenemos que agregar el almacenamiento en caching manualmente en un nivel superior a NSURLConnection .

  • Incluso cuando se llama a la respuesta storeCachedResponse incorporada de storeCachedResponse:forRequest: manualmente, solo almacena la respuesta en la memory si es menor que aproximadamente 180 KB. Probé esto llamando a storeCachedResponse manualmente y viendo que el file currentMemoryUsage antes / después no cambió para longitudes de datos superiores a unos 180 KB. Entonces tenemos que escribir nuestro propio almacenamiento en caching de memory LRU.

(Énfasis en la mía.)

Esto parece ser responsable del comportamiento que se está llamando. Como señala la respuesta actual aceptada , ASIHTTPRequest es la solución esperada para este comportamiento.

Sin embargo, tenga en count la advertencia en la parte superior de la página:

Tenga en count que ya no estoy trabajando en esta biblioteca; es posible que desee considerar utilizar otra cosa para nuevos proyectos. 🙂

Debería considerar confiar en bibliotecas admitidas o, si lo prefiere, contribuir nuevamente a esta biblioteca una vez que subyace a su código.

NSURLCache funciona con dos cachings diferentes: caching en el disco y caching en memory

  • Las respuestas se almacenarán en caching en la memory caching en memory si el tamaño de respuesta es inferior a 50 kb y
  • Las respuestas se almacenarán en caching en el caching del disco si el tamaño de respuesta es superior a 50 kb

Si inicializa NSURLCache con diskPath nil, la memory caching en el disco no estará activa y storeCachedResponse:forRequest: solo se solicitarán tamaños de respuesta que sean menores a storeCachedResponse:forRequest: .

Así que configura tu URLCache de esta manera

 [[MYCustomURLCache alloc] initWithMemoryCapacity:4 * 1024 * 1024 diskCapacity:20 * 1024 * 1024 diskPath:@"urlcache.db"]; 

¿Has revisado el estado HTTP y los encabezados de caching? Vence, caching-control, etc. ¿Quizás un server responda con status = 304 sin ningún cuerpo de respuesta?

 - (void)connection:(NSURLConnection *)conn didReceiveResponse:(NSURLResponse *)aResponse { NSLog(@"CODE: %d", ((NSHTTPURLResponse *)aResponse).statusCode); NSLog(@"HEADERS: %@", ((NSHTTPURLResponse *)aResponse).allHeaderFields); } 

No estoy seguro de cómo funciona para un UIWebvieuw, pero cuando utiliza un NSURLRequest, el tamaño máximo del file depende de cómo inicialice el URLCache (initWithMemoryCapacity: (NSUInteger) memoryCapacity …) Acabo de almacenar en caching un file de 2 MB