UIWebView stringByEvaluatingJavaScriptFromString se cuelga en iOS5.0 / 5.1 cuando se llama usando GCD

Tengo el siguiente código en viewDidLoad , que funciona correctamente en iOS 4.3, pero se cuelga en iOS 5 / 5.1. En iOS 5 / 5.1, el cuadro de dialog de alerta se muestra pero no se puede descartar, el subprocess de la interfaz de usuario se congela, el button Aceptar simplemente no se puede hacer clic.

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

¿Es esto un error?

Después de la testing, considero que es un error y cambio de código para usar

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

lo resolverá

Pruébelo en - (void)viewDidAppear:(BOOL)animated lugar

¿Por qué estás usando GCD en absoluto aquí?

Recuerde que en GCD no hay ninguna garantía sobre la cual llamará su código, independientemente de la queue. Mi conjetura es que su código DISPATCH_QUEUE_PRIORITY_DEFAULT se ejecuta en el hilo principal, lo que a su vez provoca un interlocking en su llamada dispatch_sync() . Esto podría verificarse examinando sus estados de hilo en el depurador o en los instrumentos.

Lo que vuelve a mi pregunta original: ¿qué obtienes al hacer estas circunvoluciones en lugar de simplemente llamar al método directamente en el hilo principal? Vas a bloquear de cualquier manera.

También puede cambiar su dispatch_sync() a dispatch_async() , que también debería suprimir un interlocking, pero solo debe hacerse si tiene otras necesidades de simultaneidad y no necesita un subprocess de background para bloquear.

Tratar

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