我有下面的代码viewDidLoad
,其上正常工作的iOS 4.3,但它挂在iOS 5 / 5.1。 在iOS 5 / 5.1,显示警告对话框,但不能被解雇,UI线程冻结,OK按钮就不能被点击。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
dispatch_sync(dispatch_get_main_queue(), ^{
[self.webview stringByEvaluatingJavaScriptFromString:@"alert('HELLO WORLD!')"];
});
});
这是一个错误?
测试结束后,我认为这是一个Bug,并更改代码使用
[webView performSelectorOnMainThread:@selector(stringByEvaluatingJavaScriptFromString:) withObject:js waitUntilDone:NO]
将解决这个问题。
尝试在- (void)viewDidAppear:(BOOL)animated
代替
你为什么要使用GCD都在这里吗?
请记住,在GCD也不能保证哪个线程代码会呼吁,不管队列。 我的猜测是,你DISPATCH_QUEUE_PRIORITY_DEFAULT
代码恰好是主线程,然后在你的触发死锁上运行dispatch_sync()
调用。 这可能是由于在调试器或工具检查您的线程状态进行验证。
这回来到我原来的问题:你是什么做这些盘旋,而不仅仅是直接调用此方法的主线程上得到什么? 你要阻止任何一种方式。
你也可以改变你的dispatch_sync()
来dispatch_async()
-这也应该抑制僵局,但如果你有其他并发的需求,不需要后台线程阻塞时才需要这样做。
尝试
dispatch_async(dispatch_get_main_queue(), ^{
[self.webview stringByEvaluatingJavaScriptFromString:@"alert('HELLO WORLD!')"];
});
文章来源: UIWebView stringByEvaluatingJavaScriptFromString hangs on iOS5.0/5.1 when called using GCD