10

我有以下代码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!')"];
    });
});

这是一个错误吗?

4

4 回答 4

18

经过测试,我认为它是一个 Bug,并更改代码以使用

[webView performSelectorOnMainThread:@selector(stringByEvaluatingJavaScriptFromString:) withObject:js waitUntilDone:NO]

将解决它。

于 2012-08-04T04:38:26.960 回答
0

- (void)viewDidAppear:(BOOL)animated改为尝试

于 2012-07-21T16:38:32.953 回答
-1

尝试

dispatch_async(dispatch_get_main_queue(), ^{
    [self.webview stringByEvaluatingJavaScriptFromString:@"alert('HELLO WORLD!')"];
});
于 2012-07-21T17:41:30.310 回答
-1

你为什么在这里使用 GCD?

请记住,在 GCD 中,无论队列如何,都无法保证您的代码将调用哪个线程。我的猜测是您的DISPATCH_QUEUE_PRIORITY_DEFAULT代码恰好在主线程上运行,然后在您的dispatch_sync()调用中触发了死锁。这可以通过检查调试器或仪器中的线程状态来验证。

这又回到了我最初的问题:通过进行这些卷积而不是直接在主线程上调用该方法,您会得到什么?你会阻止任何一种方式。

您也可以将您的更改dispatch_sync()dispatch_async()- 这也应该抑制死锁,但只有在您有其他并发需求并且不需要后台线程阻塞时才应该这样做。

于 2012-07-21T17:30:33.450 回答