菜鸟教程小白 发表于 2022-12-13 03:19:36

ios - WKWebView 的网页未在 dispatch_get_main_queue 内显示页面


                                            <p><p>我正在尝试在后台进程中创建多个 WKWebViewView ,然后在完成加载后将它们添加到主线程上的 View 中。</p>

<p>每个 WKWebView 都包含一个通过 javascript 呈现的图表,因此每个 WKWebView 的加载时间大约需要一秒钟,所以我试图将处理卸载到后台,这样 UI 就不会被阻塞。</p>

<p>当 dispatch_get_main_queue 被注释掉时,这工作正常,但是 ui 被阻塞 5-10 秒。只显示 WKWebView 的棕色背景,没有网页内容。</p>

<pre><code> var webViews : = []   

var myQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_async(myQueue, {

for i in 0...10
{
      var url : NSURL? = NSURL(string:&#34;http://google.com&#34;)
      var req = NSURLRequest(URL:url!)

      var webview = WKWebView(frame:CGRectMake(0, height * CGFloat(i), width, height))         
      webview.loadRequest(req)
      webview.backgroundColor = UIColor.brownColor()

      self.webViews.append(webview)
}

    dispatch_async(dispatch_get_main_queue(),{

      for item in self.webViews
      {
         self.view.addSubview(item)
      }

   });
});
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>如果我将 <code>WKWebView</code> 更改为 <code>UIWebView</code>,则会发生崩溃。</p>

<blockquote>
<p>Tried to obtain the web lock from a thread other than the main thread
or the web thread. This may be a result of calling to UIKit from a
secondary thread.</p>
</blockquote>

<p>不允许从主线程以外的线程调用 UIKit 方法。 <code>WKWebView</code> 也是 <code>UIView</code> 的子类。所以我建议你把设置框架和addSubView方法移出block,放在调用<code>dispatch_get_global_queue</code>之前,在<code>dispatch_get_global_queue</code>里面,你一个一个加载请求。 </p>

<p><em>编辑</em></p>

<p>要监控请求是否完成加载,可以实现 <code>WKNavigationDelegate</code> 的 <code>didFinishNavigation</code> 函数。可以设置一个计数器,当函数被调用时计数器加1,当计数器值等于10时,所有的webviews都满载。</p>

<pre><code>var counter = 0
var globalStart : NSDate?
var globalEnd : NSDate?
</code></pre>

<p>在<code>viewDidLoad</code>中。</p>

<pre><code>var start = NSDate()
for i in 0...9
{
    var item = WKWebView()
    item.frame = CGRectMake(0, self.view.bounds.height * CGFloat(i),
      self.view.bounds.width, self.view.bounds.height)
    item.navigationDelegate = self
    self.scrollView.addSubview(item)
    self.webViews.append(item)
}
self.scrollView.contentSize = CGSizeMake(self.view.bounds.width, (self.view.bounds.height - 50.0) * CGFloat(11))
let end = NSDate();
NSLog(&#34;creatingwebviews\(end.timeIntervalSinceDate(start))&#34;)


dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),{

    self.globalStart = NSDate()

    for item in self.webViews
    {
      var url : NSURL? = NSURL(string:&#34;http://google.com&#34;)
      var req = NSURLRequest(URL:url!)
      item.loadRequest(req)
    }
});


func webView(webView: WKWebView, didFinishNavigation navigation: WKNavigation!) {
    counter++
    println(&#34;\(counter) \(webView)&#34;)
    if counter == 10 {
      globalEnd = NSDate()
      println(globalEnd!.timeIntervalSinceDate(globalStart!))
    }
}
</code></pre>

<p>结果是<code>创建webviews 1.85267299413681</code>,而加载所有请求的时间对我来说超过8秒。我没有找到减少创建 webview 时间的方法,我认为创建这些 View 需要花费很多时间。 </p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - WKWebView 的网页未在 dispatch_get_main_queue 内显示页面,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/26920644/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/26920644/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - WKWebView 的网页未在 dispatch_get_main_queue 内显示页面