在递归函数运行期间更新UITextView

时间:2014-09-22 18:04:28

标签: objective-c recursion delegates 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];
...
...
}

-(BOOL)solve:::完成运行之前,UITextView似乎没有更新。其中只更新一次而不是多次。

不确定为什么会这样。

有关如何更新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 个答案:

答案 0 :(得分:1)

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

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