jjzjj

ios - WKWebView 的网页不显示 dispatch_get_main_queue 内的页面

coder 2024-01-24 原文

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

每个 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)
      }

     });
  });

最佳答案

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

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.

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

编辑

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

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 时间的方法,我认为创建这些 View 需要花费很多时间。

关于ios - WKWebView 的网页不显示 dispatch_get_main_queue 内的页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26920644/

有关ios - WKWebView 的网页不显示 dispatch_get_main_queue 内的页面的更多相关文章

  1. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

    我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

  2. ruby-on-rails - Rails 编辑表单不显示嵌套项 - 2

    我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib

  3. ruby-on-rails - link_to 不显示任何 rails - 2

    我试图在索引页中创建一个超链接,但它没有显示,也没有给出任何错误。这是我的index.html.erb代码。ListingarticlesTitleTextssss我检查了我的路线,我认为它们也没有问题。PrefixVerbURIPatternController#Actionwelcome_indexGET/welcome/index(.:format)welcome#indexarticlesGET/articles(.:format)articles#indexPOST/articles(.:format)articles#createnew_articleGET/article

  4. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  5. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  6. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  7. ruby-on-rails - Rails 4 WYSIWYG Bootsy 不显示格式 - 2

    我刚刚按照thebootsygempage上的安装说明进行操作在我保存并查看帖子内容之前,一切看起来都不错。这是输出在View中的样子:HeaderSubhead:似乎没有呈现任何html格式,因为它被引号或类似的东西转义了-其他人有这个问题吗?我没有在github页面或SO上看到任何问题来指出我正确的方向。除了遵循gem安装说明之外,我还没有做任何事情,但也许我错过了什么或者只是犯了一个愚蠢的错误。如果你还有什么想知道的,请尽管问。干杯 最佳答案 你需要有这样的东西,转义html: 关

  8. ruby - 为什么当我调用类的实例方法时,初始化不显示为方法? - 2

    我正在写一篇关于在Ruby中几乎一切都是对象的博客文章,我试图通过以下示例来展示这一点:classCoolBeansattr_accessor:beansdefinitialize@bean=[]enddefcount_beans@beans.countendend所以从类中我们可以看出它有4个方法(当然,除非我错了):它可以在创建新实例时初始化一个默认的空bean数组它可以计算它有多少个bean它可以读取它有多少个bean(通过attr_accessor)它可以向空数组写入(或添加)更多bean(也通过attr_accessor)但是,当我询问类本身它有哪些实例方法时,我没有看到默认

  9. ruby-on-rails - 使用 HTTP.get_response 检索 Facebook 访问 token 时出现 Rails EOF 错误 - 2

    我试图在我的网站上实现使用Facebook登录功能,但在尝试从Facebook取回访问token时遇到障碍。这是我的代码:ifparams[:error_reason]=="user_denied"thenflash[:error]="TologinwithFacebook,youmustclick'Allow'toletthesiteaccessyourinformation"redirect_to:loginelsifparams[:code]thentoken_uri=URI.parse("https://graph.facebook.com/oauth/access_token

  10. ruby - 为什么不能使用类IO的实例方法noecho? - 2

    print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上

随机推荐