【发布时间】:2013-10-23 02:28:23
【问题描述】:
我发现了一个似乎导致 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];
});
有人可以阐明导致挂起的原因吗?
编辑:
相关问题:
Perform UI Changes on main thread using dispatch_async or performSelectorOnMainThread?
Whats the difference between performSelectorOnMainThread and dispatch_async on main queue?
Grand Central Dispatch (GCD) vs. performSelector - need a better explanation
非常相似的问题:
UIWebView stringByEvaluatingJavaScriptFromString hangs on iOS5.0/5.1 when called using GCD
【问题讨论】:
标签: ios objective-c webkit grand-central-dispatch