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:]
Respuesta
Como se describe hereNSURLConnection
no llama a storeCachedResponse:forRequest:
si el tamaño del archivo es superior a 50 kb (52428 bytes).
Pruebe ASIHTTPRequestcaching.
¿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);
}
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 subclaseNSURLCache
para cambiar el comportamiento de las operaciones FETCH y tienda a utilizar el disco (comoSDURLCache
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 llamarstoreCachedResponse:forRequest:
de archivos a través de alrededor de 50 KB (> = 52428 bytes , para ser exactos). Esto hace que la subclasificaciónNSURLCache
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 aNSURLConnection
.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 decurrentMemoryUsage
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.
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
@Nevir ¡No hay problema! Estoy feliz de que haya sido útil. :) – MrGomez
¿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). –
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
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
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"];
- 1. NSURLCache no en caché
- 2. UIWebView webViewDidFinishLoad no se llama iOS
- 3. Android multitouch: ¿ACTION_UP no siempre se llama?
- 4. NSManagedObjectContextObjectsDidChangeNotification no siempre se llama instantáneamente
- 5. setNeedsDisplay no siempre llama a drawRect
- 6. rendimiento siempre se llama
- 7. ¿Por qué una instancia de UIWebView no llama a scrollViewDidScroll?
- 8. La inicialización de la unidad Delphi no siempre se llama
- 9. onKeyDown no siempre se llama en la aplicación de Android
- 10. ¿NSURLConnection se aprovecha de NSURLCache?
- 11. IOS UIWebView Fuga
- 12. UIScrollView + UIWebView = NO scrollsToTop
- 13. ShouldStartLoad de UIWebViewDelegate personalizado no se llama cuando la solicitud UIWebView comienza a cargar
- 14. Android: ¿Siempre se llama a onResume después de onCreate?
- 15. onCreate siempre se llama si navega hacia atrás con intención
- 16. android HttpResponse siempre muere la segunda vez que se llama
- 17. ¿Una llamada asincrónica siempre crea/llama un nuevo hilo?
- 18. onPostExecute no se llama
- 19. onPageScrolled() no se llama
- 20. textFieldShouldReturn no se llama
- 21. fbDidLogin no se llama
- 22. WebMethod no se llama
- 23. didReceiveRemoteNotification no se llama
- 24. mouseMoved no se llama
- 25. View.onMeasure() no se llama
- 26. onServiceConnected() no se llama
- 27. forwardInvocation no se llama?
- 28. doFilter no conseguir llama
- 29. UITableViewController no llama
- 30. accesorioButtonTappedForRowWithIndexPath: no se llama.
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