2012-02-10 20 views
6

He leído que reutilizar UIWebViews es una especie de mala práctica. Algún código que heredé en el trabajo empuja una variedad de contenido a un UIWebView. Powerpoints, documentos de Word y video. Todo esto funciona bien en circunstancias normales. Cuando llegamos a cambiar el contenido en UIWebView demasiado rápido, se vuelca.Reutilizando UIWebView está causando bloqueos

Mi webView se establece como una propiedad. Está bien conectado en IB. La selección normal de nuestra tableView carga el contenido local sin problemas. Se necesita una selección rápida de fuego de la misma celda o combinaciones de múltiples para hacer que se bloquee.

Puedo capturar algunos mensajes de error para el webViewDidFailWithError. Pero esos se dispararán incluso sin un bloqueo. Aquí está la cadena localizada de error.

The operation couldn’t be completed. (NSURLErrorDomain error -999.) 

Cuando la aplicación finalmente se cuelga, explota en este error tonto de WebCore.

Application Crash image

Si alguien tiene alguna enlaces o algunos ejemplos de código cómo manejar esto lo agradecería. Tal vez un ejemplo de cómo reutilizar mejor mi propiedad webView sin explotar las cosas.

Cargaría parte de mi código, pero hay muchas cosas que no están relacionadas con la propia webView. Todo el contenido que se envía a la webView se realiza a través del [self.webView loadRequest:request];, siendo la solicitud una solicitud NSURL completa con la ruta al contenido local.

Estaré muy agradecido si alguien me puede ayudar en este caso. Cruzaron los dedos por algo simple.

+0

Tal vez deberías bloquear la interacción del usuario mientras cargas tu webView. –

+0

Eso podría ser posible, pero no estoy seguro de que nuestro cliente lo acepte. Lo tomaré en consideración. Gracias. –

+0

¿Lo has probado con '@try {} @catch {}'? –

Respuesta

2

No estoy seguro de esta manera es la "mejor" manera de resolver el problema, pero parece estar funcionando bastante bien. Corto, dulce, y funciona.

Desactivé la interacción del usuario con TableView que actualiza el contenido en la vista web. Como tienes que aplastarlo mucho, es probable que no te falte un toque aquí o allá. Entonces, por ahora, esta es la solución.

#pragma mark - 
#pragma mark UIWebViewDelegate methods 

-(void)webViewDidStartLoad:(UIWebView *)webView { 
    [self.tableView setUserInteractionEnabled:NO]; 
} 

-(void)webViewDidFinishLoad:(UIWebView *)webView { 
    [self.tableView setUserInteractionEnabled:YES]; 
} 

// I re-enable on load failures as they can block you out entirely on fail 
-(void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error { 
    [self.tableView setUserInteractionEnabled:YES]; 
} 
0

¿Está utilizando [webview stopLoading]; antes de cargar otra solicitud? Lo que debe hacer es cancelar o detener la carga actual antes de intentar cargar una diferente. La otra opción es restringir la entrada del usuario.

+0

He intentado poner [self.webView stopLoading]; antes de llamar al nuevo loadRequest, pero no hace ninguna diferencia, aún se bloquea. –

+0

Parece que el problema está dentro de esa área. Si solo se bloquea al tocar rápidamente, entonces el problema tiene que ser con las solicitudes múltiples. En cuanto a restringir la entrada del usuario, no tiene que ser hasta que termine de cargarse. Podría intentar ignorar los toques durante medio o segundo para ver si eso soluciona el problema. – Jaybit

+0

Sí, estoy seguro de que lo arreglaría. Pero realmente no resuelve el problema. Puedo insistir bastante rápido y se sostiene. Realmente solo se bloquea con un toque poco realista. El trabajo me gustaría que descubriera cómo prevenir los bloqueos, si es posible. Gracias por la visión. –

1

Si solo se bloquea al tocar rápidamente, ¿podría poner un reconocedor de gestos sobre él para que actúe como limitador de la tasa de un hombre pobre?

+0

Reconocedor de gestos en la tablaView -didSelectRowAtIndexPath? –

+0

Sobre la vista que desencadena las solicitudes, para que no las envíe con demasiada frecuencia. –

0

En su UIWebViewDelegate, se podría aplicar webView:shouldStartLoadWithRequest:navigationType: para volver NO si ya existe una solicitud de carga.

0

No puedo evitar pensar que sería mejor no volver a utilizar UIWebView. Elimine la punta, créela programáticamente y establézcala en cero y vuelva a crear/reasignar/volver a asignarla cuando cambie la fuente de datos.

En una nota diferente me aseguraría de usar NSOperationQueue para la carga de datos.

+0

Gracias por el consejo. Lamentablemente, mis manos están atadas al asunto. Sí descubrimos cómo evitarlo. Estamos creando una UIView con un indicador de progreso que muestra que todavía se está cargando y evitando que el usuario sobrecargue la vista web. Funciona, cliente feliz, todo lo que puedo desear. Gracias por el consejo. –

+0

Suena como un buen compromiso. Mejor. – ader

Cuestiones relacionadas