1

我对 iOS 编程非常陌生,但我已经有一个无法解决的大问题。这似乎很容易。

我有一个按钮,我点击它来更改一个名为message

这是代码:

- (IBAction)react:(id)sender {
    int hasard ;
    hasard=3; 
    message.text=[NSString stringWithFormat:@"1 %d",hasard];    
    sleep (1);
    message.text=[NSString stringWithFormat:@"2 %d",hasard]; 
}

它运作良好,但我没有看到第一个message.text变化。当我单击按钮时,我必须等待一秒钟,然后我看到2 3

我以为我能看到1 3,等一下再看2 3。什么不见​​了?似乎很明显。

4

2 回答 2

6

sleep()将暂停作为主线程的当前线程执行,因此您将阻止所有 UI 操作,直到该方法完成。您需要安排第二个分配在指定时间之后运行,而不会阻塞当前的运行循环。这可以通过 GCD 来实现。

- (IBAction)react:(id)sender {
    int hasard ;
    hasard=3; 
    message.text=[NSString stringWithFormat:@"1 %d",hasard];

    int64_t delayInSeconds = 1.0;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        message.text=[NSString stringWithFormat:@"2 %d",hasard];
    });
}
于 2013-01-04T13:47:33.263 回答
1

您正在阻塞主线程(好吧,而是sleep()阻塞它)。如果您这样做,对 UI 的已提交更改将不会出现 - 您只会看到最终结果。你必须做其他事情(顺便说一下,就用户体验而言,阻止 UI 是一个非常糟糕的主意)。您可以尝试使用计时器,例如:

int hasard = 3;

- (void)react:(id)sender
{
     message.text = [NSString stringWithFormat:@"1 %d", hasard];
     [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(timer:) userInfo:nil repeats:NO];
}

- (void)timer:(NSTimer *)tmr
{
     message.text = [NSString stringWithFormat:@"2 %d", hasard];
}
于 2013-01-04T13:48:49.213 回答