2009-09-16 16 views
7

Todas las UIWebView comparten un único hilo web.Evite que el hilo principal se congele cuando UIWebView intente bloquear de forma bloqueada el hilo web

Cuando uno de ellos es init -ed, eliminado de superview etc., intentarán bloquear el hilo web del hilo principal de forma bloqueante, congelando temporalmente el ciclo de ejecución del hilo principal.

Si el hilo web está ocupado, p. mientras hace una sincronización larga XMLHttpRequest, esto puede bloquear el hilo principal durante mucho tiempo.

¿Hay alguna manera de evitar esto?

Si pudiera modificar UIWebView, me gustaría hacer que el bloqueo intente no bloquear, pero obviamente ese no es el caso, entonces estoy buscando otras ideas inteligentes.

Respuesta

6

El largo y corto de él es: evitar hacer cualquier cosa que bloquea el hilo web para una cantidad significativa de tiempo (window.alert, window.prompt, XMLHttpRequest.open('GET', url, false), posiblemente otros)

Además, evite llamar a los métodos que se traban el hilo Web y luego hacer algo que lleva mucho tiempo, ya que el hilo web solo se desbloquea una vez que se devuelve el control al ciclo de ejecución. (Ejemplo: llame al -[UITextView setText:] y luego lea un archivo de forma síncrona en el hilo principal)

+0

Entonces, ¿qué sucede en MobileSafari si una página hace un XHR sincrónico lento? No lo he probado, pero ¿se congela o qué? –

+0

Adquiere el bloqueo del hilo web durante el tiempo que dure la solicitud. Si el hilo principal intenta adquirir el bloqueo, tendrá que esperar a que se complete la solicitud (o tiempo de espera) – rpetrich

+1

Además, debo mencionar que si usa un XHR asíncrono, esto ya no será un problema (es decir, xhr. open ('GET', url, true)) – rpetrich

0

no puede hacer xhr sincrónico ya que esto dará lugar a errores de política entre dominios.

Cuestiones relacionadas