0

我有一个作为秒表基础的 NSTimer。

- (void)startTimer
{
    _startDate = [NSDate date];
    _timer = [NSTimer scheduledTimerWithTimeInterval:1.0/10.0
                                              target:self 
                                            selector:@selector(updateTimer) 
                                            userInfo:nil 
                                             repeats:YES];
}

我需要记录单圈时间,但我遇到了两个单独的单圈时间不应共享任何重叠的问题。

即如果第 1 圈从 0.0 开始并在 10.0 结束,那么第 2 圈应该从 10.01 开始但是在有圈的那一刻,我只取当前时间,计算上一圈的结束和新的开始一:

- (void)lap
{
    NSTimeInterval timeInterval = [[NSDate date] timeIntervalSinceDate:_startDate];
    timeInterval += _timeElapsed;

    _startDate = [NSDate date];
}

我需要保存每圈的开始/结束时间以及它们的总长度。但是如果不同圈的开始/结束时间相同,我看不出如何做到这一点。

有没有人遇到过这个问题?任何想法我可以如何明智地解决它。我想到的一切都感觉很脆弱。

4

1 回答 1

1

如果它是一个真正的单圈计时器,据我所知,那么你假设两个单独的圈应该有一个差距是不准确的。具体来说,声明:

即如果第 1 圈从 0.0 开始并在 10.0 结束,那么第 2 圈应该从 10.01 开始

对于我对单圈计时器的理解是不正确的。第二圈立即开始,因为 lap2 的开始与 lap1 的停止相同。否则,您将在这些差距上浪费时间。

我建议只节省每个单独的时间。因此,如果您跑了 5 圈,则应该有大小时间(如果您总是从零开始,则为 5)。您现在有了每圈开始和结束的时间标记。

0.00
10.03
20.04
30.09
40.20
50.33

总用时50.53,第三圈用时10.05(30.09-20.04)。所有单圈的总和应等于总时间。

现在,您可以轻松获得每圈的总时间和时间。假设这些值存储在一个数组中,您可以轻松做到:

- (void)startStopLap {
    // compute elapsed time...
    [self.times addObject:[NSNumber numberWithDouble:elapsedTime]];
}

- (double)totalTime {
    [[self.times lastObject] doubleValue]
        - [[self.times objectAtIndex:0] doubleValue];
}

- (double)timeForLap:(NSUInteger)lap {
    // Example assumes first lap is lap '1' and that you do
    // appropriate error checking...
    return [[self.times objectAtIndex:lap] doubleValue]
         - [[self.times objectAtIndex:lap-1] doubleValue];
}

同样,您可以通过简单的减法获得前 N 圈的时间,并且您可以获得特定圈数范围(即第 2-4 圈)的时间。

希望这是有道理的,而且我没有太多的错别字没有编译器来检查......

于 2012-09-06T14:06:16.537 回答