我试图在后台进程中创建多个WKWebView视图,然后在完成加载后将它们添加到主线程上的视图中。
每个WKWebView都包含一个通过javascript呈现的图表,因此每个WKWebView的加载时间大约是1秒钟,所以我试图将处理卸载到后台,这样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)
}
});
});发布于 2014-11-14 04:01:58
如果我将WKWebView更改为UIWebView,就会发生崩溃。
尝试从主线程或web线程以外的线程获取web锁。这可能是从辅助线程调用UIKit的结果。
不允许从主线程以外的线程调用UIKit方法。WKWebView也是一个UIView子类。因此,我建议您将设置框架和addSubView方法从块中移出,并将其放在调用dispatch_get_global_queue之前,在dispatch_get_global_queue块中,依次加载请求。
编辑
要监视请求是否已完成加载,您可以实现WKNavigationDelegate的didFinishNavigation函数。您可以设置一个计数器,在调用该函数时使计数器增加1,当计数器值等于10时,所有的when视图都被完全加载。
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秒。我没有找到一种方法来减少创建way视图的时间,我认为创建这些视图需要花费那么多时间。
发布于 2014-11-15 12:31:56
为什么不在创建容器视图后立即对其进行webview,并立即启动它的请求,以便数据在您仍然在创建视图时也会显示出来?所有这些都在for循环中与相应的quque对应。只需尝试使进程更异步即可。
https://stackoverflow.com/questions/26920644
复制相似问题