Vermeiden Hauptthread gefriert, wenn UIWebView versucht, blockierend den Web-Thread zu sperren
-
07-07-2019 - |
Frage
Alle UIWebViews teilen sich eine einzige Web-Thread.
Wenn einer von ihnen init
-ed ist, aus Super entfernt usw., werden sie versuchen, den Web-Thread aus dem Hauptthread in einer blockierenden Weise zu verriegeln, wodurch zeitweise die Laufschleife des Haupt-Thread einzufrieren.
Wenn der Web-Thread besetzt ist, z während eines langen synchronen XMLHttpRequest
tut, hat dies den Haupt-Thread für eine lange Zeit blockieren kann.
Gibt es eine Möglichkeit, dies zu vermeiden?
Wenn ich UIWebView ändern könnte, würde ich nur die nicht-blockierende Sperre Versuch machen, aber offensichtlich ist das nicht der Fall, so dass ich bin auf der Suche nach anderen cleveren Ideen.
Lösung
Das lange und kurze davon ist: alles vermeiden, was zu tun, dass blockiert der Web-Thread für eine erhebliche Menge an Zeit (window.alert
, window.prompt
, XMLHttpRequest.open('GET', url, false)
, möglicherweise andere)
Vermeiden Sie auch Methoden aufrufen, die den Web-Thread und dann sofort etwas zu tun, sperren, die eine lange Zeit wie der Web-Thread nimmt nur entriegelt, sobald die Steuerung an die Laufschleife zurückgeführt wird. (Beispiel: call -[UITextView setText:]
dann eine Datei synchron auf dem Haupt-Thread lesen)
Andere Tipps
Sie können nicht synchron xhr machen, da diese Politik Fehler zu domänenübergreif führen wird.