今天看到一道很有意思的面试题,想了半天也不得其解,想上来问问大家。怎么实现一个精准的Timer?我写了如下的代码进行测试。1.在主线程中。NSTimer*tiemer=[NSTimerscheduledTimerWithTimeInterval:1.0target:selfselector:@selector(output)userInfo:nilrepeats:YES];-(void)output{NSLog(@"-------------");}发现间隔时间大概在正负5毫秒之间徘徊。就像这样:2013-05-0216:25:32.550TestDemoArc[21139:907]-------------2013-05-0216:25:33.549TestDemoArc[21139:907]-------------2013-05-0216:25:34.554TestDemoArc[21139:907]-------------2013-05-0216:25:35.555TestDemoArc[21139:907]-------------如果在主线程中做一些操作,比如:intj=0;for(inti=0;i
2 回答
波斯汪
TA贡献1811条经验 获得超4个赞
IOS中可以使用"mach_absolute_time"获取到CPU的tickcount的计数值,可以通过"mach_timebase_info"函数获取到纳秒级的精确度代码如下:uint64tstart=0;uint64tend=0;uint64_telapsed=0;mach_timebase_info_ttimeBaseInfo=mach_timebase_info(info);start=mach_absolute_time();//dosomething//.....end=mach_absolute_time();elapsed=end-start;//converttonanosecondsuint64_telapsedNanoSeconds=elapsed*sTimebaseInfo.numer/sTimebaseInfo.denom;但是CPU线程之间的调度肯定要花费时间,所以只能尽可能的精确。
aluckdog
TA贡献1847条经验 获得超7个赞
计时器不准确的原因是,计时器只有在runLoop的一次循环中被检查,所以如果在上次循环中做了什么耗时的操作,那么计时器就被延后执行了。正确的方法应该是新开一个线程,然后在新开的线程里设定一个timer,并执行。__blockTestViewController*blockSelf=self;dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{blockSelf->_timer=[NSTimerscheduledTimerWithTimeInterval:1.0target:blockSelfselector:@selector(caculateLeftTimeForTomorrow)userInfo:nilrepeats:YES];[[NSRunLoopcurrentRunLoop]addTimer:blockSelf->_timerforMode:NSDefaultRunLoopMode];[[NSRunLoopcurrentRunLoop]run];});
添加回答
举报
0/150
提交
取消