留在Obj-C的时间

时间:2014-07-09 20:13:32

标签: ios nstimer

所以我有一个标签和一个不断增长的字符串。每次字符串添加一些东西时,我想添加一个时间戳,我的问题是这样做的最佳方法是什么。我尝试使用NSTimer,每隔0.001秒增加一次,但问题是当我的应用程序速度减慢时,保持时间也是如此,因此它不是非常准确。还有其他想法吗?继承了我试过的代码:

在视图中加载:

if (debugTimeTimer.isValid != true) {
    debugTimeTimer = [NSTimer scheduledTimerWithTimeInterval:0.001 target:self selector:@selector(addTime) userInfo:nil repeats:YES];
}

addTime:

-(void) addTime {
debugMilli = debugMilli + 1;

if (debugMilli >= 1000) {
    debugSec = debugSec + 1;
    debugMilli = 0;
}

if (debugSec >= 60) {
    debugMin = debugMin + 1;
    debugSec = 0;
}
}

它添加到字符串的位置:

if (debugMin >=1) {
     debugTextString = [NSString stringWithFormat:@"%i:%i:%i     %@\r%@",debugMin, debugSec, debugMilli, charString, debugTextString];
} else {
    debugTextString = [NSString stringWithFormat:@"%i:%i     %@\r%@",debugSec, debugMilli, charString, debugTextString];
}

2 个答案:

答案 0 :(得分:1)

此任务的最佳功能是CACurrentMediaTime,它是QuartzCore框架的一部分。返回值是double,表示以秒为单位的时间,精确度为亚毫秒。

如果您在应用启动时存储CACurrentMediaTime的初始读数,则可以从后续读数中减去该初始值,以获得应用启动时的相对时间。要以毫秒为单位获得时间,请乘以1000.0

例如,如果您定义属性

@property (nonatomic) CFTimeInterval startTime;

并在viewDidLoad

中初始化该属性
self.startTime = CACurrentMediaTime();

然后您可以使用类似

的代码生成时间戳(以毫秒为单位)
uint64_t timeStampInMilliseconds;

CFTimeInterval delta = CACurrentMediaTime() - self.startTime;
timeStampInMilliseconds = delta * 1000.0;
NSLog( @"%llu", timeStampInMilliseconds );

您还可以使用此代码

将时间戳分解为分钟,秒和毫秒
uint64_t temp, milliseconds, seconds, minutes;
temp = timeStampInMilliseconds;
milliseconds = temp % 1000;
temp /= 1000;
seconds = temp % 60;
minutes = temp / 60;
NSLog( @"%llu:%02llu.%03llu", minutes, seconds, milliseconds );

答案 1 :(得分:0)

void printf_to_debug (char* fmt, ...) {

va_list args;
va_start( args, fmt );

vprintf(fmt, args);

charString = [[NSString alloc] initWithFormat:@(fmt) arguments:args];

va_end( args );


//time ch
static CFTimeInterval startTime = -1.0;

if ( startTime < 0.0 )
    startTime = CACurrentMediaTime();

uint64_t timeStampInMilliseconds;

CFTimeInterval delta = CACurrentMediaTime() - startTime;
timeStampInMilliseconds = delta * 1000.0;
NSLog( @"%llu", timeStampInMilliseconds );


if (debugMin >=1) {
     debugTextString = [NSString stringWithFormat:@"%i:%i:%i     %@\r%@",debugMin, debugSec, debugMilli, charString, debugTextString];
} else {
    debugTextString = [NSString stringWithFormat:@"%i:%i     %@\r%@",debugSec, debugMilli, charString, debugTextString];
}



}