UIWebView的stringByEvaluatingJavaScriptFromString在i

2019-06-26 11:05发布

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

这是一个错误?

Answer 1:

测试结束后,我认为这是一个Bug,并更改代码使用

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

将解决这个问题。



Answer 2:

尝试在- (void)viewDidAppear:(BOOL)animated代替



Answer 3:

你为什么要使用GCD都在这里吗?

请记住,在GCD也不能保证哪个线程代码会呼吁,不管队列。 我的猜测是,你DISPATCH_QUEUE_PRIORITY_DEFAULT代码恰好是主线程,然后在你的触发死锁上运行dispatch_sync()调用。 这可能是由于在调试器或工具检查您的线程状态进行验证。

这回来到我原来的问题:你是什么做这些盘旋,而不仅仅是直接调用此方法的主线程上得到什么? 你要阻止任何一种方式。

你也可以改变你的dispatch_sync()dispatch_async() -这也应该抑制僵局,但如果你有其他并发的需求,不需要后台线程阻塞时才需要这样做。



Answer 4:

尝试

dispatch_async(dispatch_get_main_queue(), ^{
    [self.webview stringByEvaluatingJavaScriptFromString:@"alert('HELLO WORLD!')"];
});


文章来源: UIWebView stringByEvaluatingJavaScriptFromString hangs on iOS5.0/5.1 when called using GCD