2

我正在尝试在后台进程中创建多个 WKWebView 视图,然后在完成加载后将它们添加到主线程上的视图中。

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

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

 var webViews : [WKWebView] = []   

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

 for i in 0...10
 {
      var url : NSURL? = NSURL(string:"http://google.com")
      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)
      }

     });
  });
4

2 回答 2

1

如果我将 更改WKWebViewUIWebView,则会发生崩溃。

试图从除主线程或 web 线程之外的线程获取 web lock。这可能是从辅助线程调用 UIKit 的结果。

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

编辑

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

var counter = 0
var globalStart : NSDate?
var globalEnd : NSDate?

而在viewDidLoad.

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("creating  webviews  \(end.timeIntervalSinceDate(start))")


dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),{

    self.globalStart = NSDate()

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


func webView(webView: WKWebView, didFinishNavigation navigation: WKNavigation!) {
    counter++
    println("\(counter) \(webView)")
    if counter == 10 {
        globalEnd = NSDate()
        println(globalEnd!.timeIntervalSinceDate(globalStart!))
    }
}

结果是creating webviews 1.85267299413681,加载所有请求的时间对我来说超过 8 秒。我没有找到减少创建 webview 时间的方法,我认为创建这些视图需要花费很多时间。

于 2014-11-14T04:01:58.133 回答
0

为什么不在创建容器视图后立即对其进行 webview 并立即触发它的请求,以便即使在您仍在创建视图时数据也开始显示?所有这些都在 for 循环中,并带有相应的分派到适当的 quque。试着让这个过程更加异步

于 2014-11-15T12:31:56.643 回答