2014-09-22 4 views
0

UITextView가 프레임에로드 된 뷰 컨트롤러가 있습니다. 함수 자체를 호출 할 때마다 UITextView 텍스트를 업데이트하고 싶습니다.재귀 함수 실행 중 UITextView가 실행 중입니다.

메인 스레드에서 UITextView를 업데이트하려고 시도하지만 재귀 기능이 실행 된 후에 View UNTIL의 텍스트를 설정하지 않은 것처럼 보입니다.

'Maze.h'는 프로토콜을 정의하는 객체이고 'MainViewController.m'은 위임자입니다. Heres는

컨트롤러에 대한 코드 :

'MainViewController.m'

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 

    Maze *aMaze = [[Maze alloc] initWithMaze:@"Maze.txt" andUpdate:true everyXSeconds:1]; 
    [aMaze setDelegate:self]; 
    if (![aMaze parseFile]) { 
     exit(2); 
    } 

    if ([aMaze solve:-1 y:-1 z:-1]){ 
     NSLog(@"%@", [aMaze printMazeHorizontally]); 
     NSLog(@"Escapable: %@", [aMaze getMoveSequence]); 
    } else { 
     NSLog(@"Unescapable"); 
     exit(1); 
    } 
} 

- (void)didMakeMove:(NSString *)maze { 
    NSLog(@"%@", maze); 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self.maze setText:maze]; 
    }); 
} 

'Maze.m'

- (BOOL)solve:(NSInteger)x y:(NSInteger)y z:(NSInteger)z 
{ 
... 

... 
     [self.delegate didMakeMove:self.printMazeVertically]; 
... 
... 
} 

UITextView 그냥 -(BOOL)solve::: 실행이 완료 될 때까지 업데이트하지 않는 것 같습니다. 이는 여러 번 업데이트되는 것이 아니라 한 번만 업데이트됩니다.

왜 이런 일이 발생하는지 잘 모름.

UITextView를 업데이트하는 방법에 대한 아이디어가 있으십니까?

UI 업데이트가 주 스레드에서 수행되어야한다고 생각 했습니까?

Solution: 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     if ([aMaze solve:-1 y:-1 z:-1]){ 
      NSLog(@"%@", [aMaze printMazeHorizontally]); 
      NSLog(@"Escapable: %@", [aMaze getMoveSequence]); 
     } else { 
      NSLog(@"Unescapable"); 
      exit(1); 
     } 
    }); 

답변

1

그리기는 나중에 실행 루프 실행 또는 다음 실행 루프 실행에서 수행됩니다. 따라서 재귀가 실행되는 동안 주 스레드를 차단하면 사용자가 재귀를 끝낼 때까지 UI가 업데이트되지 않습니다.

디자인을 변경하는 것이 좋습니다. 세금 재귀를 백그라운드 스레드로 이동하고 GCD를 사용하여 UI를 업데이트하십시오.

+0

달콤한 .... 내가 말한 것처럼 재귀 함수가 백그라운드에서 실행되도록해야만 ... 감사합니다 레오 .. – jsetting32

+0

건배. 대답이 도움이 되었다면 동의하십시오. –

관련 문제