2009-08-28 8 views
20

Me di cuenta de que el safari de iphone almacena el contenido en caché para que la carga de la página para más adelante sea mucho más rápida que un navegador de escritorio. Así que tome la página web móvil de Gmail, por ejemplo, la primera carga es bastante lenta (5-10 segundos). Pero si cierro la pestaña y vuelvo a abrir la página, es muy rápido (1 segundo).Cómo almacenar contenido en UIWebView para una carga más rápida más adelante?

Sin embargo, este comportamiento no es el mismo si carga el contenido a través de un UIWebView en su aplicación. ¿Me estoy perdiendo algunos ajustes? ¿Cómo hago para que el UIWebView almacene en caché el contenido automáticamente sin tener que pasar por la molestia de guardar el contenido yo mismo?

Respuesta

1

Basado en this discussion thread parece que no hay ningún caché de nivel de sistema operativo posible con UIWebView. Según la experiencia, me he dado cuenta de que Safari en mi dispositivo con sistema operativo iPhone no almacena en caché sus páginas web (por ejemplo, presionar el botón Atrás en Safari no recarga la página anterior desde un caché).

+0

Parece que la memoria caché solo funciona en el manifiesto HTML 5 que se utiliza cuando no está conectado. – jianhua

21

La clave es: NSURLRequestReturnCacheDataElseLoad

NSData *urlData; 
NSString *baseURLString = @"mysite.com"; 
NSString *urlString = [baseURLString stringByAppendingPathComponent:@"myfile"]; 

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString] cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval: 10.0]; 
NSURLConnection *connection=[[NSURLConnection alloc] initWithRequest:request delegate:nil]; 

if (connection) 
{ 
    urlData = [NSURLConnection sendSynchronousRequest: request]; 

    NSString *htmlString = [[NSString alloc] initWithData:urlData encoding:NSUTF8StringEncoding]; 
    [webView loadHTMLString:htmlString baseURL:baseURLString]; 
    [htmlString release]; 
} 

[connection release]; 
+9

La documentación de iOS dice que NSURLRequestReturnCacheDataElseLoad "Especifica que los datos de caché existentes se deben usar para satisfacer una solicitud, independientemente de su antigüedad o fecha de caducidad". Por lo general, eso no es lo que quiere, ya que ignora los encabezados de política de caché, como max-age, etc. Entonces esto no suena como una buena respuesta general. La mejor opción aparentemente es "NSURLRequestUseProtocolCachePolicy", pero parece que no hace nada. – Yetanotherjosh

-1

he hecho un par de aplicaciones que las páginas de caché en la carpeta de documentos, a continuación, se comparan las marcas de tiempo de los & páginas web almacenadas en caché antes de cargar la nueva página Web . Por lo que el flujo básico es:

if (fileIsInCache) 
    if (cacheFileDate > webFileDate) 
     getCachedFile 
    else 
     getFileFromWeb 
     saveFileToCache 
else 
    getFileFromWeb 
    saveFileToCache 

stuffFileIntoUIView 

maybeReduceCache 

Usted todavía tiene que golpear la web para obtener las cabeceras, pero eso es por lo general mucho más rápido que la descarga de una página/imagen/archivo completo.

+6

¿Tiene algún código de muestra de esto? – Tudorizer

2
NSString *stringurl=[NSString stringWithFormat:@"http://www.google.com"]; 
NSURL *url=[NSURL URLWithString:stringurl]; 
NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:15.0]; 
[uiwebview loadRequest:theRequest]; 

Se carga una URL primera vez después busca sólo para los cambios de contenido .., si no hay cambios en el contenido de URL que se carga desde la memoria caché (almacenamiento local).

+0

¿Puedes explicarlo un poco? – Miki

+0

Cargará una url por primera vez y luego buscará solo los cambios de contenido. Si no hay actualizaciones en el contenido de la URL, se cargará desde la memoria caché (almacenamiento local). –

+0

Sí, pero haz esto en la respuesta – Miki

Cuestiones relacionadas