【问题标题】:Avoid main thread freezes when UIWebView tries to blockingly lock the web thread当 UIWebView 尝试阻塞锁定 web 线程时,避免主线程冻结
【发布时间】:2009-09-16 08:01:30
【问题描述】:

所有 UIWebView 共享一个网络线程。

当其中一个是init-ed,从superview等中移除时,它们会尝试以阻塞的方式将web线程与主线程锁定,从而暂时冻结主线程的运行循环。

如果网络线程很忙,例如在进行长时间同步XMLHttpRequest时,这可能会长时间阻塞主线程。

有没有办法避免这种情况?

如果我可以修改 UIWebView,我只会让锁尝试非阻塞,但显然情况并非如此,所以我正在寻找其他聪明的想法。

【问题讨论】:

    标签: iphone cocoa-touch uiwebview


    【解决方案1】:

    总而言之:避免在很长一段时间内阻塞网络线程(window.alertwindow.promptXMLHttpRequest.open('GET', url, false),可能还有其他)

    另外,避免调用锁定 web 线程的方法,然后立即执行需要很长时间的操作,因为 web 线程只有在控制返回到运行循环后才会解锁。 (例如:调用-[UITextView setText:]然后在主线程上同步读取一个文件)

    【讨论】:

    • 如果页面执行慢速同步 XHR,MobileSafari 会发生什么?我还没有测试它,但它只是冻结还是什么?
    • 它在请求期间获取网络线程的锁。如果主线程随后尝试获取锁,则必须等待请求完成(或超时)
    • 另外,我应该提一下,如果您使用异步 XHR,这将不再是问题(即 xhr.open('GET', url, true))
    • 制作 XHR 的函数必须显示为简单的函数调用(带有返回值),而不是异步触发/回调函数,不幸的是:/
    • 换句话说,它必须阻止 Javascript 执行。我也想避免它阻塞主线程。
    【解决方案2】:

    您不能进行同步 xhr,因为这会导致跨域策略错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-12
      • 1970-01-01
      • 2015-05-25
      • 2011-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多