10

に次のコードがありますviewDidLoad。これはiOS4.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

テスト後、私はそれをバグと見なし、使用するコードを変更します

[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

なぜここでGCDを使用しているのですか?

GCDでは、キューに関係なく、コードがどのスレッドで呼び出されるかは保証されないことに注意してください。私の推測では、DISPATCH_QUEUE_PRIORITY_DEFAULTコードはたまたまメインスレッドで実行されており、それがdispatch_sync()呼び出しのデッドロックを引き起こしていると思います。これは、デバッガーまたはInstrumentsでスレッドの状態を調べることで確認できます。

これは私の元の質問に戻ります:メインスレッドで直接メソッドを呼び出すのではなく、これらの畳み込みを行うことで何が得られますか?どちらの方法でもブロックします。

dispatch_sync()に変更することもできます。これによりdispatch_async()、デッドロックも抑制されますが、他の同時実行のニーズがあり、ブロックするためのバックグラウンドスレッドが必要ない場合にのみ実行する必要があります。

于 2012-07-21T17:30:33.450 に答える
-1

試す

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