2009-09-16 5 views
7

Tous les UIWebViews partagent un seul thread Web. Lorsque l'un d'eux est init -ed, retiré de la vue d'ensemble, etc., il tentera de bloquer le fil d'âme du fil principal de manière bloquante, bloquant ainsi temporairement la boucle d'exécution du fil principal.Évitez que le thread principal ne se bloque lorsque UIWebView tente de verrouiller de manière bloquante le thread Web

Si le fil de trame est occupé, par ex. tout en faisant un long XMLHttpRequest synchrone, cela peut bloquer le thread principal pendant une longue période.

Y at-il un moyen d'éviter cela?

Si je pouvais modifier UIWebView, je ferais simplement une tentative de blocage non bloquante, mais évidemment ce n'est pas le cas, donc je cherche d'autres idées intelligentes.

Répondre

6

La longue et courte, il est: éviter tout ce qui bloque le fil Web pour une quantité importante de temps (window.alert, window.prompt, XMLHttpRequest.open('GET', url, false), peut-être d'autres)

Aussi, évitez d'appeler des méthodes qui verrouillent le fil web et puis immédiatement faire quelque chose qui prend beaucoup de temps car le fil Web n'est déverrouillé qu'une fois que le contrôle est retourné à la boucle d'exécution. (Exemple: appel -[UITextView setText:] puis lire un fichier de manière synchrone sur le thread principal)

+0

Alors, que se passe-t-il dans MobileSafari si une page effectue un XHR synchrone lent? Je ne l'ai pas testé, mais est-ce que ça gèle ou quoi? –

+0

Il acquiert le verrou du thread Web pendant la durée de la demande. Si le thread principal tente alors d'acquérir le verrou, il devra attendre la fin de la requête (ou timeout) – rpetrich

+1

Aussi, je dois mentionner que si vous utilisez un XHR asynchrone, ce ne sera plus un problème (par exemple xhr. open ('GET', url, true)) – rpetrich

0

Vous ne pouvez pas faire xhr synchrone car cela conduira à des erreurs de politique crossdomain.

Questions connexes