首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WKWebView的网页没有在dispatch_get_main_queue中显示页面

WKWebView的网页没有在dispatch_get_main_queue中显示页面
EN

Stack Overflow用户
提问于 2014-11-13 23:51:41
回答 2查看 3.1K关注 0票数 2

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

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

当dispatch_get_main_queue被注释掉时,这很好,但是ui被阻塞了5-10秒。只有WKWebView的棕色背景出现,网页上没有任何内容。

代码语言:javascript
复制
 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)
      }

     });
  });
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-14 04:01:58

如果我将WKWebView更改为UIWebView,就会发生崩溃。

尝试从主线程或web线程以外的线程获取web锁。这可能是从辅助线程调用UIKit的结果。

不允许从主线程以外的线程调用UIKit方法。WKWebView也是一个UIView子类。因此,我建议您将设置框架和addSubView方法从块中移出,并将其放在调用dispatch_get_global_queue之前,在dispatch_get_global_queue块中,依次加载请求。

编辑

要监视请求是否已完成加载,您可以实现WKNavigationDelegatedidFinishNavigation函数。您可以设置一个计数器,在调用该函数时使计数器增加1,当计数器值等于10时,所有的when视图都被完全加载。

代码语言:javascript
复制
var counter = 0
var globalStart : NSDate?
var globalEnd : NSDate?

viewDidLoad

代码语言:javascript
复制
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秒。我没有找到一种方法来减少创建way视图的时间,我认为创建这些视图需要花费那么多时间。

票数 1
EN

Stack Overflow用户

发布于 2014-11-15 12:31:56

为什么不在创建容器视图后立即对其进行webview,并立即启动它的请求,以便数据在您仍然在创建视图时也会显示出来?所有这些都在for循环中与相应的quque对应。只需尝试使进程更异步即可。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26920644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档