1

我需要测量经过的时间,以便知道何时超过了某个时间段。

我曾经为此使用Ticks()and Microseconds(),但现在不推荐使用这两个函数。

CFAbsoluteTimeGetCurrent不是正确的使用方法,因为它可能会向后运行,如文档中所述:

重复调用此函数并不能保证结果单调递增。由于与外部时间参考同步或由于用户明确更改时钟,系统时间可能会减少。

还有什么不被弃用且相当面向未来的?

4

2 回答 2

2

Q&A 1398中所述,一种方法是使用mach_absolute_time如下:

    static mach_timebase_info_data_t sTimebaseInfo;
    mach_timebase_info(&sTimebaseInfo); // Determines the time scale

    uint64_t t1 = mach_absolute_time();
    ...
    uint64_t t2 = mach_absolute_time();
    uint64_t elapsedNano = (t2-t1) * sTimebaseInfo.numer / sTimebaseInfo.denom;

不过,这也可能不是万无一失的。正如本答案中所指出的,在某些情况下,这些值可能会溢出。

于 2015-05-12T19:25:22.687 回答
1

使用NSTimeInterval

用于指定时间间隔,以秒为单位。

例子:

- (void)loop {

    NSDate *startTime = [NSDate date];

    sleep(90); // sleep for 90 seconds

    [self elapsedTime:startTime];
}

- (void)elapsedTime:(NSDate *)startTime {

NSTimeInterval elapsedTime = fabs([startTime timeIntervalSinceNow]);

int intSeconds = (int) elapsedTime;
int intMinutes = intSeconds / 60;
intSeconds = intSeconds % 60;

NSLog(@"Elapsed Time: %d minute(s) %d seconds", intMinutes, intSeconds);

}

结果:

Elapsed Time: 1 minute(s) 29 seconds

目前尚不清楚您正在寻找哪种类型的精度,尽管 NSTimeInterval 可以容纳几分之一秒(例如十分之一、百分之一、千分之一等)

于 2015-05-13T00:04:36.197 回答