在无限循环目标C中停止死亡风车

jam*_*ick 7 macos objective-c

我正在为我自己的mac编写一个简单的计时器程序.计时器正常倒计时,但我得到了死亡的旋转风车.怎样才能使风车消失?我认为它是因为我有一个无限循环,但必须有一些绕过它.

我有一个按钮点击触发的IBAction(按钮开始).从那里,它调用了另一个完成工作的功能.

这是我的IBAction:

- (IBAction)timerStart:(id)sender {
    self.timerDidPause = NO;
    [self timerRunning];
}
Run Code Online (Sandbox Code Playgroud)

这里是timerRunning:

- (void)timerRunning {
for (;;) {
    usleep(1000000);
    if (self.timerDidPause == YES) {

    }
    else {
        if (self.seconds == 0) {
            if (self.minutes == 0) {
                [self timerDone];
                break;
            }
            else {
                self.seconds = 59;
                self.minutes = self.minutes - 1;
                [self formatTimerLabel:self.hours :self.minutes :self.seconds];
            }
        }
        else {
            self.seconds = self.seconds - 1;
            [self formatTimerLabel:self.hours :self.minutes :self.seconds];
        }
    }
}
}
Run Code Online (Sandbox Code Playgroud)

在这个函数中,函数formatTimerLabel被调用,所以这里是:

- (void)formatTimerLabel:(int)hours
                    :(int)minutes
                    :(int)seconds {
NSString *minuteString = [[NSString alloc] init];
NSString *secondString = [[NSString alloc] init];
if (minutes < 10) {
    minuteString = [NSString stringWithFormat:@"0%d", minutes];
}
else {
    minuteString = [NSString stringWithFormat:@"%d", minutes];
}
if (seconds < 10) {
    secondString = [NSString stringWithFormat:@"0%d", seconds];
}
else {
    secondString = [NSString stringWithFormat:@"%d", seconds];
}
[self.timerLabel setStringValue:[NSString stringWithFormat:@"%d:%@:%@", hours, minuteString, secondString]];
[self.timerLabel display];
}
Run Code Online (Sandbox Code Playgroud)

Car*_*rum 7

您导致UI线程与循环挂起.几秒钟后,操作系统将光标切换到风车.

您需要查看NSTimer" 计时器编程指南"以安排计时器在UI线程之外运行.