Избегайте зависаний основного потока, когда UIWebView пытается блокировать веб-поток.

Все UIWebViews используют один веб-поток.

Когда один из них init-ed, удален из супервизора и т. д., они попытаются заблокировать веб-поток от основного потока блокирующим образом, тем самым временно заморозив цикл выполнения основного потока.

Если веб-поток занят, например. при выполнении длинного синхронного XMLHttpRequest это может надолго заблокировать основной поток.

Есть ли способ избежать этого?

Если бы я мог изменить UIWebView, я бы просто сделал попытку блокировки неблокирующей, но, очевидно, это не так, поэтому я ищу другие умные идеи.


person Jaka Jančar    schedule 16.09.2009    source источник


Ответы (2)


Короче говоря, избегайте делать что-либо, что блокирует веб-поток в течение значительного периода времени (window.alert, window.prompt, XMLHttpRequest.open('GET', url, false), возможно, другие)

Кроме того, избегайте вызова методов, которые блокируют веб-поток, а затем немедленного выполнения чего-то, что занимает много времени, поскольку веб-поток разблокируется только после того, как управление будет возвращено в цикл выполнения. (Пример: вызовите -[UITextView setText:], затем синхронно прочитайте файл в основном потоке)

person rpetrich    schedule 16.09.2009
comment
Так что же происходит в MobileSafari, если страница выполняет медленный синхронный XHR? Я не проверял, но он просто зависает или что? - person Jaka Jančar; 16.09.2009
comment
Он требует блокировки веб-потока на время запроса. Если основной поток затем попытается получить блокировку, ему придется дождаться завершения запроса (или истечения времени ожидания). - person rpetrich; 16.09.2009
comment
Кроме того, я должен упомянуть, что если вы используете асинхронный XHR, это больше не будет проблемой (например, xhr.open('GET', url, true)) - person rpetrich; 16.09.2009
comment
Функция, создающая XHR, должна отображаться как простой вызов функции (с возвращаемым значением), а не как асинхронная функция триггера/обратного вызова, к сожалению:/ - person Jaka Jančar; 16.09.2009
comment
Другими словами, он должен блокировать выполнение Javascript. Я также хочу, чтобы он не блокировал основной поток. - person Jaka Jančar; 16.09.2009
comment
Трудно предотвратить получение основным потоком блокировки веб-потока, поскольку это требуется большинству методов в UITextView, UITextField и UIWebView, но вы можете сделать свои API-интерфейсы javascript асинхронными и при этом не слишком уродливыми: MyAPI.MyMethod(param1, function(r) { document.getElementById('результат').innerText = r;}); - person rpetrich; 16.09.2009

вы не можете сделать синхронный xhr, так как это приведет к ошибкам междоменной политики.

person Alex    schedule 29.05.2012