2012-01-27 7 views
9

Parece que UIWebView no siempre llama a storeCachedResponse:forRequest: cada vez que carga un recurso. ¿Alguien sabe por qué? Estoy tratando de almacenar en caché imágenes usando -[NSURLCache storeCachedResponse:forRequest:], hace 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 en realidad hay imágenes en él.UIWebView no siempre llama - [NSURLCache storeCachedResponse: forRequest:]

+0

noto esto también; aunque solo * en * dispositivo para mi aplicación. Cuando la vista web carga una solicitud de NSURLCache, parece omitir ese mismo caché para los activos en esa página. – Nevir

Respuesta

4

Como se describe hereNSURLConnection no llama a storeCachedResponse:forRequest: si el tamaño del archivo es superior a 50 kb (52428 bytes).
Pruebe ASIHTTPRequestcaching.

+0

Estoy viendo esto para archivos pequeños (cientos de bytes) también. La vista web tampoco puede llamar a 'cachedResponseForRequest:' – Nevir

+0

@ Nevir. Consulte [mi respuesta] (http://stackoverflow.com/a/9968398/517815). :) – MrGomez

2

¿Ha comprobado el estado HTTP y los encabezados de la memoria caché? Expira, Cache-Control, etc. Tal vez un servidor responde con el estado = 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); 
} 
10

Responder a la consulta del proveedor de recompensa:

que estoy viendo esto para pequeños archivos (100s de bytes) también. La vista web también falla al llamar cachedResponseForRequest:

encontré this question que se ocupa de este comportamiento directamente:

A pesar de la documentación de Apple indicating otherwise, NSURLCache en IOS no hace ningún disco (flash) el almacenamiento en caché en absoluto . Usted puede subclase NSURLCache para cambiar el comportamiento de las operaciones FETCH y tienda a utilizar el disco (como SDURLCache hace), pero debido a la siguientes limitaciones graves de cómo se utiliza y se implementa la caché, esto no lo hace funcionar tan bien como era de esperar:

  • NSURLConnection ni siquiera llamar storeCachedResponse:forRequest: de archivos a través de alrededor de 50 KB (> = 52428 bytes , para ser exactos). Esto hace que la subclasificación NSURLCache sea inútil para el uso de (imágenes de 200KB), ya que ni siquiera llegará al caché. Como resultado de , debemos agregar el almacenamiento en caché manualmente en un nivel superior a NSURLConnection.

  • Incluso cuando uno llama del NSURLCache incorporada storeCachedResponse:forRequest: manualmente, sólo se almacena la respuesta en la memoria si es menos de aproximadamente 180 KB. Probé esto por llamando storeCachedResponse manualmente y viendo que el antes/después de currentMemoryUsage no cambió para longitudes de datos superiores a aproximadamente 180 KB. Así que tenemos que escribir nuestro propio almacenamiento en memoria caché LRU también.

(El subrayado es mío.)

Ésta parece ser responsable del comportamiento sea declarado out. Como the current accepted answer points out, ASIHTTPRequest es la solución esperada para este comportamiento.

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

Tenga en cuenta que ya no estoy trabajando en esta biblioteca - es posible que desee considerar el uso de algo más para nuevos proyectos. :)

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

+1

Lo agradezco :) (Y un gran ejemplo de dónde debería haber buscado más) - ¡gracias por tomarse el tiempo para profundizar en esto! – Nevir

+0

@Nevir ¡No hay problema! Estoy feliz de que haya sido útil. :) – MrGomez

+0

¿Alguien sabe si este sigue siendo el caso con NSURLSession en iOS 7/8? Tengo problemas para obtener NSURLCache para guardar archivos de imagen grandes (~ 7MB). –

2

No estoy seguro de cómo funciona para un UIWebvieuw, pero cuando se utiliza un NSURLRequest el tamaño máximo del archivo depende de cómo inicializar la Urlcache (initWithMemoryCapacity: (NSUInteger) memoryCapacity ...) acabo en caché un archivo de 2 MB

+0

Para mí, un archivo .css de 515 KB solicitado en UIWebView se puede tratar con 'cachedResponseForRequest:' de una subclase 'NSURLCache' inicializada con' memoryCapacity: 0 diskCapacity: 1024 * 1024 * 256' – hiroshi

3

NSURLCache obras con dos cachés diferentes: en el disco de memoria caché y en memoria caché

  • las respuestas se almacenan en caché en la memoria caché en memoria si el tamaño de la respuesta es bajo 50kb y
  • Las respuestas se almacenan en caché en la memoria caché en el disco si el tamaño de la respuesta es sobre 50kb

Si inicializa NSURLCache con nula diskPath entonces el caché en el disco no estará activo y storeCachedResponse:forRequest: sólo se pidió tamaños de respuesta inferiores a 50 kb.

Así configurar su Urlcache como esto

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