循环不会改变标签,因为我希望它在目标c中

时间:2013-08-23 14:57:11

标签: ios objective-c c

我只是在xcode上玩目标c,这可能看起来像一个愚蠢的问题,但这是我的代码块,它可以工作,但它不能工作我想要它。

        int i = 10;
    int x = 0;
    do {

        printf("Count is: %i\n", x);
        NSString *Result = [[NSString alloc] initWithFormat: @"%i", x];
        counting.text = Result;
        x++;
        usleep(1000000);
    } while (x < i);

它只在循环结束时将标签更改为9,它打印到控制台正常,但它应该从0到9计数并在应用程序上显示它。 我想我需要todo多线程,但示例是在java中,所以我不能将它们应用于这种语言

4 个答案:

答案 0 :(得分:2)

它没有更新,因为您正在阻止(使用usleep)主线程,它执行所有绘图(以及触摸和任何其他UI交互)。您需要设置文本然后让主线程返回。你应该让这个线程设置延迟调用:

int i = 10;
int x = 0;
do {
    printf("Count is: %i\n", x);
    NSString *Result = [[NSString alloc] initWithFormat: @"%i", x];
    [counting performSelector:@selector(setText:) withObject:Result afterDelay:x];
    x++;
} while (x < i);

答案 1 :(得分:0)

你可以试试这个:

int i = 10;
int x = 0;
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 0);
do {
    NSString *Result = [[NSString alloc] initWithFormat: @"%i", x];
    time = dispatch_time(time, (int64_t)(1.0 * NSEC_PER_SEC));
    dispatch_after(time, dispatch_get_main_queue(), ^(void){
        counting.text = Result;
    });
    x++;
} while (x < i);

正如评论中所提到的,这里还有很多其他事情你需要注意。 linked question有一些很好的信息。

答案 2 :(得分:0)

正如人们在评论中已经提到的,问题是因为usleep(1000000)冻结了你的主线程,谁负责与UI的交互,包括更新它。

如果更改此行[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]];的睡眠,此代码应该按预期工作,而无需使用其他线程:

int i = 10;
int x = 0;
do {

    printf("Count is: %i\n", x);
    NSString *Result = [[NSString alloc] initWithFormat: @"%i", x];
    counting.text = Result;
    x++;
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]];
} while (x < i);

答案 3 :(得分:0)

我更喜欢使用计时器而不是在主线程或任何其他线程中休眠。请检查一下这个问题

How do I use NSTimer?