UIImageView no se actualiza

Actualmente estoy construyendo un juego de ajedrez para iPhone. Las piezas en el tablero están representadas por una serie de UIImageViews, cada una de las cuales representa un cuadrado del tablero y hace referencia a la imagen correcta para mostrar en ese cuadrado. Una vez elegido un cuadrado y realizado el movimiento, la función -(void)updateBoard; se llama en el ViewController:

-(void)updateBoard{

NSLog(@"updating board");

[square1 setImage:[UIImage imageNamed:[game imageForSquare:1]]];
[square2 setImage:[UIImage imageNamed:[game imageForSquare:2]]];
[square3 setImage:[UIImage imageNamed:[game imageForSquare:3]]];
[square4 setImage:[UIImage imageNamed:[game imageForSquare:4]]];
[square5 setImage:[UIImage imageNamed:[game imageForSquare:5]]];
[square6 setImage:[UIImage imageNamed:[game imageForSquare:6]]];
[square7 setImage:[UIImage imageNamed:[game imageForSquare:7]]];
[square8 setImage:[UIImage imageNamed:[game imageForSquare:8]]];
[square9 setImage:[UIImage imageNamed:[game imageForSquare:9]]];
[square10 setImage:[UIImage imageNamed:[game imageForSquare:10]]];
[square11 setImage:[UIImage imageNamed:[game imageForSquare:11]]];
[square12 setImage:[UIImage imageNamed:[game imageForSquare:12]]];
[square13 setImage:[UIImage imageNamed:[game imageForSquare:13]]];
[square14 setImage:[UIImage imageNamed:[game imageForSquare:14]]];
[square15 setImage:[UIImage imageNamed:[game imageForSquare:15]]];
[square16 setImage:[UIImage imageNamed:[game imageForSquare:16]]];
[square17 setImage:[UIImage imageNamed:[game imageForSquare:17]]];
[square18 setImage:[UIImage imageNamed:[game imageForSquare:18]]];
[square19 setImage:[UIImage imageNamed:[game imageForSquare:19]]];
[square20 setImage:[UIImage imageNamed:[game imageForSquare:20]]];
[square21 setImage:[UIImage imageNamed:[game imageForSquare:21]]];
[square22 setImage:[UIImage imageNamed:[game imageForSquare:22]]];
[square23 setImage:[UIImage imageNamed:[game imageForSquare:23]]];
[square24 setImage:[UIImage imageNamed:[game imageForSquare:24]]];
[square25 setImage:[UIImage imageNamed:[game imageForSquare:25]]];
[square26 setImage:[UIImage imageNamed:[game imageForSquare:26]]];
[square27 setImage:[UIImage imageNamed:[game imageForSquare:27]]];
[square28 setImage:[UIImage imageNamed:[game imageForSquare:28]]];
[square29 setImage:[UIImage imageNamed:[game imageForSquare:29]]];
[square30 setImage:[UIImage imageNamed:[game imageForSquare:30]]];
[square31 setImage:[UIImage imageNamed:[game imageForSquare:31]]];
[square32 setImage:[UIImage imageNamed:[game imageForSquare:32]]];
[square33 setImage:[UIImage imageNamed:[game imageForSquare:33]]];
[square34 setImage:[UIImage imageNamed:[game imageForSquare:34]]];
[square35 setImage:[UIImage imageNamed:[game imageForSquare:35]]];
[square36 setImage:[UIImage imageNamed:[game imageForSquare:36]]];
[square37 setImage:[UIImage imageNamed:[game imageForSquare:37]]];
[square38 setImage:[UIImage imageNamed:[game imageForSquare:38]]];
[square39 setImage:[UIImage imageNamed:[game imageForSquare:39]]];
[square40 setImage:[UIImage imageNamed:[game imageForSquare:40]]];
[square41 setImage:[UIImage imageNamed:[game imageForSquare:41]]];
[square42 setImage:[UIImage imageNamed:[game imageForSquare:42]]];
[square43 setImage:[UIImage imageNamed:[game imageForSquare:43]]];
[square44 setImage:[UIImage imageNamed:[game imageForSquare:44]]];
[square45 setImage:[UIImage imageNamed:[game imageForSquare:45]]];
[square46 setImage:[UIImage imageNamed:[game imageForSquare:46]]];
[square47 setImage:[UIImage imageNamed:[game imageForSquare:47]]];
[square48 setImage:[UIImage imageNamed:[game imageForSquare:48]]];
[square49 setImage:[UIImage imageNamed:[game imageForSquare:49]]];
[square50 setImage:[UIImage imageNamed:[game imageForSquare:50]]];
[square51 setImage:[UIImage imageNamed:[game imageForSquare:51]]];
[square52 setImage:[UIImage imageNamed:[game imageForSquare:52]]];
[square53 setImage:[UIImage imageNamed:[game imageForSquare:53]]];
[square54 setImage:[UIImage imageNamed:[game imageForSquare:54]]];
[square55 setImage:[UIImage imageNamed:[game imageForSquare:55]]];
[square56 setImage:[UIImage imageNamed:[game imageForSquare:56]]];
[square57 setImage:[UIImage imageNamed:[game imageForSquare:57]]];
[square58 setImage:[UIImage imageNamed:[game imageForSquare:58]]];
[square59 setImage:[UIImage imageNamed:[game imageForSquare:59]]];
[square60 setImage:[UIImage imageNamed:[game imageForSquare:60]]];
[square61 setImage:[UIImage imageNamed:[game imageForSquare:61]]];
[square62 setImage:[UIImage imageNamed:[game imageForSquare:62]]];
[square63 setImage:[UIImage imageNamed:[game imageForSquare:63]]];
[square64 setImage:[UIImage imageNamed:[game imageForSquare:64]]];


NSLog(@"-------------------BOARD READOUT-----------------------:");

for (int i = 1; i <=64; i++) {
    NSLog(@"Square %i: %@", i, [game imageForSquare:i]);
}

}

'square1', 'square2', etc. son UIImageViews, y el método [game imageForSquare:] devuelve una NSString* de la imagen adecuada que debe mostrarse.

Cuando juego con dos jugadores humanos, el tablero se actualiza perfectamente, y después de esto, el programa espera la entrada del siguiente jugador, y he ejecutado muchos juegos sin ningún problema.

También tengo un jugador de computadora que selecciona su movimiento usando un algoritmo, y actualmente estoy tratando de configurar un juego con dos jugadores de computadora uno contra el otro. (Todavía no he probado un juego humano contra computadora).

El problema es que cuando se llama al método updateBoard, ninguna de las imágenes se actualiza, aunque la lectura de NSLog en la parte inferior me dice que todo funcionó bien, y en realidad puedo ver a los dos jugadores jugando a través de la consola.

Supongo que esto tiene algo que ver con el hecho de que inmediatamente después de llamar a updateBoard estoy pasando el control al siguiente jugador de la computadora y de alguna manera eso impide que UIImageViews se actualice correctamente. Hice una prueba para comentar la línea de código donde se llama al siguiente jugador (lo que significa que solo se realiza un movimiento y luego se detiene la ejecución) y el tablero se actualizó correctamente.

Perdón por la pregunta larga, ¡gracias de antemano por cualquier sugerencia!

preguntado el 25 de agosto de 12 a las 14:08

1 Respuestas

La interfaz de usuario solo se actualiza cuando el control del programa vuelve al bucle de ejecución principal. Debe hacer el cálculo en un subproceso de fondo y llamar

dispatch_async(dispatch_get_main_queue(), ^{
   [self updateBoard];
});

del subproceso de fondo cuando desee actualizar la pantalla. Entonces no bloqueará la interfaz de usuario mientras realiza el cálculo.

Respondido 25 ago 12, 15:08

Gracias, esto funciona perfectamente. Si bien no lo entiendo totalmente, parece hacer el trabajo, ¡lo pondré en mi lista de cosas para leer! - SteveB

Solo puedo recomendar las sesiones de la WWDC sobre este tema, por ejemplo, "WWDC 2012 Sesión 211 - Creación de interfaces de usuario simultáneas". - Martin R

De hecho, presento una vista de tabla en popoverController en la que hay una celda que contiene una vista de imagen. Esto resolvió mi problema, pero no entiendo el punto. ¿Cuándo y dónde apareció el asíncrono en el caso? Porque no hice ningún hilo. ¿Puedes explicarme por favor? - Thanh-Nhon Nguyen

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.