gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:19:27 26 4
gpt4 key购买 nike

我正在尝试在后台进程中创建多个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com