- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试在后台进程中创建多个 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里面,一个一个的加载请求。
编辑
要监视请求是否已完成加载,您可以实现 WKNavigationDelegate
的 didFinishNavigation
函数。可以设置一个计数器,当函数被调用时计数器加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/
我有一个启用了分页的 UIScrollView,我想显示一些带有图像的“页面”。 我在主线程中加载第一页的图像并显示它。然后我开始在后台线程中加载其他页面图像 dispatch_async(l
我是 iOS 开发新手。我不知道 dispatch_get_main_queue() 所以我想从我的服务器图像 url 中获取图像大小,如 首先,我解析我的 JSON 数据并获取图像大小,如下所示 [
我使用 Reachability 和 dispatch_async(dispatch_get_main_queue() 测试互联网连接当我测试以下代码时,它可以正常工作,但会被多次调用。 家长: @p
我在 iOS 中学到了一条全局规则 -> 永远不要阻塞主线程。但是,有几次我遇到了违反此规则的开源代码片段。 下面是两个这样的例子: 以下函数取自 https://github.com/piwik/p
在完成例程中 [NSURLConnection sendAsynchronousRequest:request queue:que
我有一个 ViewController,点击按钮后我想从网络获取数据。 let myClass = Class() myClass.myMethod() { dispatch_
我有这段代码,有时变量 dConfiguration 是 Nil,我得到一个 EXC_BAD_ACCESS 错误,大多数时候变量说 0 键/值对,错误几乎不可能重现,我只需点击我的按钮大部分时间都能正
Utility.managedObjectContext().performBlockAndWait({ }) dispatch_sync(dispatch_get_main_queue(), { }
我有一些如下代码: - (void)viewDidLoad { [super viewDidLoad]; NSLog(@"1"); dispatch_async(dispatc
如何使用 DispatchQueue 类为 iOS 替换以下 Swift 代码?这是旧的 Swift 3 代码,最新的 Xcode 不会将其转换为 Swift 5。 dispatch_async(di
我有在某些情况下更改 UI 的方法。 例如: -(void) myMethod { if(someExpressionIsTrue) { // make some UI changes
关于this question我想知道关于何时使用 NSNotification(在主线程中有观察者)与使用 GCD 将工作从后台线程分派(dispatch)到主线程,是否有任何普遍接受的逻辑? 似乎
我的应用程序中有一个场景,我想在一个方法中执行一些耗时的任务,其中包括一些数据处理以及 UI 更新。我的方法是这样的, - (void)doCalculationsAndUpdateUIs {
当基本 SDK 设置为 10.9 时,我在 SWIFT 中使用“dispatch_get_main_queue()”时遇到困难。我使用的代码是一个简单的dispatch_async调用,如下所示: d
我想将所有读/写数据库操作放到后台队列中,并在完成时更新当前的 UI View 。 如果用户在我处理数据库时停留在 View 中,则没有问题。但是,如果用户在数据库操作完成之前离开该 View ,它将
我正在尝试在后台进程中创建多个 WKWebView View ,然后在它们全部完成加载后将它们添加到主线程上的 View 。 每个 WKWebView 都包含一个通过 javascript 呈现的图表
我继承了一个使用以下线程结构的代码库: dispatch_async(dispatch_get_main_queue(), { () -> Void in dispatch_async(dis
在 tutorial from Ray Wenderlich Series, 之一中他在完成 block 中使用了 dispatch_get_main_queue() 如下 func startFil
我刚刚开始在 iOS 上工作,并且一直在浏览 GCD 上的 Apple 引用资料。 dispatch_get_global _queue 返回一个并发队列,可以向其中提交要执行的 block 。 但是
我继承了一些具有这种相当不寻常的嵌套序列的代码。通常的范例将对主队列进行一次分派(dispatch)以更新 UI。下面显示的代码将对主队列的调度嵌套在对主队列的另一个调度中。 - (void)view
我是一名优秀的程序员,十分优秀!