WebKit でデッドロックを引き起こしていると思われる問題を発見しました。このコードをメイン スレッドから実行すると、正しくアラートが表示されます。アラートの「OK」ボタンをタップすると、アラートが消え、すべてが正常に機能しています。
[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');"];
});
});
これら 2 つの唯一の違いは、2 番目のものでは、ディスパッチ キューのコンテキストでメイン スレッドで 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 - より詳しい説明が必要
非常によく似た質問:
UIWebView stringByEvaluatingJavaScriptFromString は、GCD を使用して呼び出すと、iOS5.0/5.1 でハングします。