Избегайте зависаний основного потока, когда UIWebView пытается блокировать веб-поток
-
07-07-2019 - |
Вопрос
Все UIWebViews имеют общий веб-поток.
Когда один из них имеет init
, удаляется из суперпредставления и т. д., он пытается блокировать веб-поток из основного потока блокирующим образом, таким образом временно замораживая цикл выполнения основной поток.
Если веб-поток занят, например, при выполнении длинного синхронного XMLHttpRequest
это может на долгое время блокировать основной поток.
Есть ли способ избежать этого?
Если бы я мог изменить UIWebView, я бы просто сделал попытку блокировки неблокируемой, но, очевидно, это не так, поэтому я ищу другие умные идеи.
Решение
Короче говоря: избегайте делать что-либо, что блокирует веб-поток в течение значительного периода времени ( window.alert
, window.prompt
, XMLHttpRequest.open ('GET', url, false)
, возможно, другие)
Кроме того, избегайте вызова методов, которые блокируют веб-поток, а затем немедленно выполняйте что-то, что занимает много времени, поскольку веб-поток разблокируется только после того, как управление возвращается в цикл выполнения. (Пример: вызовите - [UITextView setText:]
, а затем синхронно прочитайте файл в главном потоке)
Другие советы
вы не можете сделать синхронный xhr, так как это приведет к ошибкам междоменной политики.