2012-08-25 4 views
4

현재 iPhone 용 체스 게임을 제작 중입니다. 보드의 조각은 보드의 사각형에 각각 나타내는 일련의 UIImageViews로 표시되며 해당 사각형에 대해 표시 할 올바른 이미지를 참조합니다. 하나의 사각형이 선택되었고 이동이 이루어졌습니다. function - (void) updateBoard; 'square2'등UIImageView가 업데이트되지 않습니다.

-(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'UIImageViews은, 상기 [게임 imageForSquare : 상기의 ViewController에서 호출되어있어서 필요에 적절한 화상있는 NSString *를 반환 표시됩니다.

사람이 두 명으로 게임을 할 때 보드가 완벽하게 업데이트되며,이 후 프로그램은 다음 플레이어의 입력을 기다리고 아무 문제없이 많은 게임을 실행합니다.

나는 또한 알고리즘을 사용하여 이동을 선택하는 컴퓨터 플레이어가 있으며, 나는 현재 서로에 대해 두 대의 컴퓨터 플레이어가있는 게임을 설정하려고합니다. (나는 인간 대 컴퓨터 게임을 아직 시도하지 않았다).

문제는 updateBoard 메서드가 호출 될 때 이미지가 업데이트되지 않는다는 것입니다. 하단의 NSLog 판독 값은 모든 것이 정상적으로 실행되었음을 알려주고 콘솔을 통해 게임을하는 두 명의 플레이어를 실제로 볼 수 있습니다.

나는 updateBoard를 호출 한 직후에 컨트롤을 다음 컴퓨터 플레이어로 전달하고 어떻게해서든지 UIImageViews가 올바르게 업데이트되지 못하게한다는 사실과 관련이 있다고 가정합니다. 나는 다음 플레이어가 호출되는 코드 행을 주석 처리하는 테스트를 수행했는데 (단 한 번의 이동 만 수행 한 다음 실행이 중지됨을 의미) 보드가 올바르게 업데이트되었습니다.

오랜 질문을드립니다. 미리 제안 해 주셔서 감사합니다.

답변

15

사용자 인터페이스는 프로그램 제어가 주 실행 루프로 돌아올 때만 업데이트됩니다. 계산을 백그라운드 스레드에서 수행해야하며, 디스플레이 업데이트를 원할 때 백그라운드 스레드에서

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

을 호출해야합니다. 그런 다음 계산을 수행하는 동안 UI를 차단하지 않습니다.

+1

감사합니다. 이것은 완벽하게 작동합니다. 나는 그것을 완전히 이해하지는 못하지만 일을하는 것처럼 보입니다. 나는 그것을 읽는 것에 대한 나의 목록에 올려 놓을 것입니다! – SteveB

+0

"WWDC 2012 세션 211 - 동시 사용자 인터페이스 작성"과 같이이 주제와 관련된 WWDC 세션 만 권장 할 수 있습니다. –

+0

당신의 해결책은 내 문제를 해결했습니다 :) 고마워요! – KiNG

관련 문제