1

我只是在xcode上玩objective 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 并在应用程序上显示它。我想我需要做多线程,但例子是在java中,所以我不能将它们应用于这种语言

4

4 回答 4

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);
于 2013-08-23T15:06:01.233 回答
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);

正如评论中提到的,这里还有很多其他事情需要注意。链接的问题有一些很好的信息。

于 2013-08-23T15:04:44.890 回答
0

正如人们在评论中已经提到的那样,问题在于usleep(1000000)冻结了您的主线程,该线程负责与 UI 的交互,包括更新它。

如果您更改此 line 的 sleep [[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);
于 2013-08-23T15:05:47.063 回答
0

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

如何使用 NSTimer?

于 2013-08-23T15:44:04.040 回答