【问题标题】:Update UITextView during recursive function is running在递归函数运行期间更新 UITextView
【发布时间】:2014-11-16 19:00:43
【问题描述】:

我有一个 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);
        }
    });

【问题讨论】:

    标签: objective-c recursion delegates uitextview


    【解决方案1】:

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

    考虑更改您的设计。将繁重的递归移至后台线程,并使用 GCD 更新 UI。

    【讨论】:

    • Sweet.... 我所要做的就是让递归函数像你说的那样在后台运行...谢谢 Leo..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    • 2014-10-01
    相关资源
    最近更新 更多