Necesito enviar un bloque en la cola principal, sincrónicamente. No sé si actualmente estoy ejecutando el hilo principal o no. La solución ingenua se ve así:¿Cómo despachar en la cola principal sincrónicamente sin un punto muerto?
dispatch_sync(dispatch_get_main_queue(), block);
Pero si estoy actualmente en el interior de un bloque que se ejecuta en la cola principal, esta llamada crea un punto muerto. (El envío síncrono espera a que el bloque hasta el final, pero el bloque ni siquiera empezar a correr, ya que estamos esperando a que el actual para terminar.)
El siguiente paso obvio es para comprobar si la cola actual:
if (dispatch_get_current_queue() == dispatch_get_main_queue()) {
block();
} else {
dispatch_sync(dispatch_get_main_queue(), block);
}
Esto funciona, pero es feo. Antes de que al menos lo oculte detrás de alguna función personalizada, ¿no hay una mejor solución para este problema? Insisto en que no puedo permitirme el envío del bloque de forma asíncrona: la aplicación se encuentra en una situación en la que el bloque enviado de forma asíncrona se ejecutará "demasiado tarde".
Creo que es bastante buena solución. Todo lo que puede hacer es hacerlo como una macro predefinida, por lo que su código no se verá tan feo. –
Esta es más o menos la solución de "libro de texto". –