2012-08-25 2 views
4

Je suis actuellement en train de construire un jeu d'échecs pour iPhone. Les pièces sur le tableau sont représentées par une série de UIImageViews qui représentent chacun sur le carré du tableau, et référencent l'image correcte à afficher pour ce carré. Un carré a été choisi et le mouvement a été fait, la fonction - (void) updateBoard; est appelé à la ViewController:UIImageView pas de mise à jour

-(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. sont UIImageViews, et le [jeu imageForSquare:] méthode renvoie un NSString * de l'image appropriée qui doit être affichée. Lorsque vous jouez avec deux joueurs humains, la carte se met à jour parfaitement, et après cela le programme attend l'entrée du joueur suivant, et j'ai exécuté de nombreux jeux sans aucun problème.

J'ai également un lecteur d'ordinateur qui sélectionne son mouvement en utilisant un algorithme, et j'essaie actuellement de mettre en place un jeu avec deux joueurs d'ordinateur les uns contre les autres. (Je n'ai pas encore essayé un jeu humain contre un ordinateur). Le problème est que lorsque la méthode updateBoard est appelée aucune des images n'est mise à jour, bien que la lecture NSLog en bas me dise que tout s'est bien passé, et je peux voir les deux joueurs jouer au jeu via la console.

Je suppose que cela a quelque chose à voir avec le fait qu'après avoir appelé updateBoard je passe le contrôle au prochain lecteur d'ordinateur et que cela empêche les UIImageViews de se mettre à jour correctement. J'ai fait un test pour commenter la ligne de code où le prochain joueur est appelé (ce qui signifie qu'un seul coup est fait et l'exécution s'arrête) et le tableau s'est mis à jour correctement.

Désolé pour la question longue, merci d'avance pour toute suggestion!

Répondre

15

L'interface utilisateur est mise à jour uniquement lorsque le contrôle de programme retourne à la boucle de démarrage principale. Vous devriez faire le calcul dans un thread d'arrière-plan, et appelez

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

du fil d'arrière-plan lorsque vous souhaitez mettre à jour l'affichage. Ensuite, vous ne serez pas bloquer l'interface utilisateur tout en faisant le calcul.

+1

Merci, cela fonctionne parfaitement. Alors que je ne comprends pas tout à fait, il semble faire le travail, je vais le mettre sur ma liste de choses à lire! – SteveB

+0

Je ne peux que recommander les sessions de la WWDC autour de ce sujet, par exemple "WWDC 2012 Session 211 - Construire des interfaces utilisateur simultanées". –

+0

Votre solution a résolu mon problème :) Merci! – KiNG

Questions connexes