2010-01-06 44 views
25

Estoy desarrollando una aplicación que requiere almacenar en caché páginas web (completamente) junto con sus archivos e imágenes CSS después de guardar todo el HTML de la página (pasando por los enlaces para almacenar cada archivo junto con el archivo HTML).iPhone UIWebView carga lenta en archivos HTML locales

Al ver el archivo HTML sin conexión, UIWebView tarda mucho tiempo en cargar la página, dado que ya estoy fuera de línea, y el archivo está en el disco junto con su CSS y las imágenes.

Estoy usando este código para cargar el archivo:

NSData *htmlData = [NSData dataWithContentsOfFile:htmlFilePath]; 
    [wView loadData:htmlData MIMEType:@"text/html" textEncodingName:@"UTF-8" baseURL:[NSURL fileURLWithPath:self.htmlFolderPath isDirectory:YES]]; 

¿Hay cualquier otro medio de cargar el archivo a la UIWebView que puede cargar más rápido?

P.S: carga muy rápido en el simulador (sin conexión), pero en el dispositivo que se necesita mucho tiempo (teniendo en cuenta su un archivo ya almacenado en caché sin conexión)

Gracias por la ayuda.

+1

¿Son estas grandes páginas web? ¿En qué tipo de dispositivo estás cargando? Recuerde que gran parte del rendimiento de WebKit está ligado tanto a la CPU como a la memoria, no solo a la conexión; ¿Cuál es la diferencia de velocidad en comparación con la carga 'en vivo'? –

+0

sí, son un poco grandes, pero están fuera de línea (local en el disco) no hay conexión a internet implicada los estoy cargando en el iPhone 3G –

+1

Como dijo Ben, hay un tiempo de procesamiento no nulo involucrado en la creación de una web página. El iPhone 3G tiene un procesador mucho, mucho más lento que tu Mac de escritorio. ¿Has intentado guardar estas páginas en un servidor web local y cargarlas a través de Mobile Safari a través de WiFi? –

Respuesta

3

Dado que esto probablemente solo lleva tiempo porque necesita analizar y representar la página, puede considerar el encendido de UIWebView en segundo plano; es decir, agregado como una subvista, pero no visible.

Quizás el UIWebView sea lo suficientemente inteligente como para saber que no necesita hacer nada, pero sospecho que al menos el análisis html y css se realiza de inmediato.

Si no hace nada sin ser visible, reduzca el tamaño a 1x1 y establezca la opacidad = 0, y ponga ese píxel en algún lugar donde no pueda interferir con el manejo de eventos táctiles.

No es perfecto, pero puede funcionar.

0

Le puedo dar una idea sobre formas alternativas de cargar HTML desde un archivo en el UIWebView. Un proyecto pequeño Tengo utiliza Objective-C como un contenedor puro para UIWebView

El proyecto está aquí, pero el código principal es el siguiente: http://github.com/robb1e/iWeb

- (void)viewDidLoad { 
    NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"test" ofType:@"html" inDirectory:@"."]]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
    [webView loadRequest:request]; 
    [super viewDidLoad]; 
} 

También estoy explorando formas de mejorar la rendimiento percibido al mostrar una imagen mientras el DOM se está preparando. Algunas de las respuestas que he tenido aquí:

Displaying a background image on UIWebView

6

es su solución en realidad las cosas de caché que no sean el archivo html, es decir, imágenes, CSS, etc, y reencadenando en la página HTML? Supongo que está descargando y almacenando en caché la página html y los recursos externos, luego UIWebView está cargando ese html y aún saliendo para cargar los recursos externos. Eso explicaría el rendimiento rápido en el simulador y el rendimiento más lento en el dispositivo.

Aquí hay una biblioteca diseñada para hacer exactamente lo que está tratando de hacer: ASIWebPageRequest.

También debe tenerse en cuenta que podría ser simplemente un caso de embotellamiento de E/S de disco. Sé que en mi proyecto estaba cargando imágenes grandes en una vista única e incluso después de que fueron almacenadas en caché, noté un poco de retraso cuando las saqué del disco porque eran muy grandes.

+1

¿Te importaría releer tu publicación aquí y aclararla? Lo leí varias veces y realmente no puedo entender lo que intentas decir en el primer párrafo. El enlace es muy apreciado sin embargo. – Josh

1

Estoy casi seguro de que nunca serás capaz de hacer esto. UIWebView solo necesita algo de tiempo para procesar su página web, incluso cuando se trata de una página local.

Teniendo esto en cuenta, puede intentar precargar la página antes de que se muestre. Por ejemplo, si lo muestra después de que un usuario presiona un botón, precargue la página cuando muestre el botón en lugar de cuando el usuario presiona el botón. El usuario no nota la carga lenta, porque se maneja en segundo plano, por lo que cuando el usuario presiona el botón, la página ya está cargada.

4

He encontrado que ciertos tipos de CSS pueden detener la renderización de WebView. Por ejemplo:

body { -webkit-box-shadow:inset 0 0 100px #222; } 

Esto funciona muy bien en el simulador, se ve bien también. Pero en el teléfono (incluso el iPhone 4, iOS 4.2), una página simple tardará 10 segundos en renderizarse.

0

Sólo si en caso de que alguien pasa lo mismo a mí ...

tuve una UIWebView que estaba cargando un html cuerda y todos los recursos (js y css) fue almacenado localmente.

Me he enfrentado a que cargar el contenido con conexión a Internet fue algo lento (1 o 2 segundos para cargar y aparecer la vista web en mi controlador) pero cuando traté de cargar la misma página SIN conexión a Internet, era rápido, realmente rápido

Recuerdo que mi plantilla HTML tenía esto en el inicio <base href="http://somesite.com" /> que he usado para cargar algunas imágenes con rutas relativas en algunos contenidos.

Eliminando ese trabajo como encanto. De modo que puede hacer que la carga de su página web sea más lenta, incluso si no tiene ninguna referencia al contenido externo en su HTML.