我有一个带有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);
}
});
答案 0 :(得分:1)
稍后在runloop运行或下一次runloop运行中执行绘图。因此,如果在递归运行时阻塞主线程,则在递归递归之前UI不会更新。
考虑改变你的设计。将累加递归移至后台线程,并使用GCD更新UI。