2014-09-22 34 views
0

我有一个视图控制器,UITextView加载到框架中。每次函数调用时,我都想更新UITextView的文本。在递归函数运行期间更新UITextView

我试图更新主线程上的UITextView,但似乎并没有在递归函数完成运行后设置View UNTIL的文本。

'Maze.h'是定义协议的对象,'MainViewController.m'是委托。

继承人的控制器代码:

'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

在稍后的runloop运行或下一个runloop运行中执行绘图。因此,如果您在递归运行时阻止主线程,则在您结束递归之前UI不会更新。

考虑改变你的设计。将征税递归移至后台线程,并使用GCD更新UI。

+0

Sweet ....我所要做的就是让递归函数在后台运行,就像你说的......感谢利奥.. – jsetting32 2014-09-22 18:14:37

+0

干杯。如果答案对您有帮助,请接受。 – 2014-09-22 18:16:35