我发现了一个似乎导致 WebKit 死锁的问题。如果我从我的主线程运行此代码,我会正确地看到一个警报。我可以点击警报上的“确定”按钮,它会消失并且一切正常:
[theWebView stringByEvaluatingJavaScriptFromString:@"alert('hi');"];
如果我稍作修改,仍然会出现警报消息,但无法点击 OK 按钮 - 您无法关闭警报,如果您闯入应用程序,它会挂在stringByEvaluatingJavaScriptFromString
通话中:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
dispatch_async(dispatch_get_main_queue(), ^{
[theWebView stringByEvaluatingJavaScriptFromString:@"alert('hi');"];
});
});
两者唯一不同的是,第二个是在调度队列的上下文中在主线程中运行 JS。
另一方面,如果我执行以下操作,则不会发生挂起:
- (void) showHi:(id) it
{
[(UIWebView*)it stringByEvaluatingJavaScriptFromString:@"alert('hi');"];
}
....
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self performSelectorOnMainThread:@selector(showHi:) withObject:theWebView waitUntilDone:NO];
});
有人可以对导致挂起的问题有所了解吗?
编辑:
相关问题:
使用 dispatch_async 或 performSelectorOnMainThread 在主线程上执行 UI 更改?
主队列上的 performSelectorOnMainThread 和 dispatch_async 有什么区别?
Grand Central Dispatch (GCD) 与 performSelector - 需要更好的解释
非常相似的问题:
使用 GCD 调用 UIWebView stringByEvaluatingJavaScriptFromString 在 iOS5.0/5.1 上挂起