为了账号安全,请及时绑定邮箱和手机立即绑定

在iOS中,怎么实现一个相对精准的Timer?

在iOS中,怎么实现一个相对精准的Timer?

交互式爱情 2019-04-07 09:38:02
今天看到一道很有意思的面试题,想了半天也不得其解,想上来问问大家。怎么实现一个精准的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;
//converttonanoseconds
uint64_telapsedNanoSeconds=elapsed*sTimebaseInfo.numer/sTimebaseInfo.denom;
但是CPU线程之间的调度肯定要花费时间,所以只能尽可能的精确。
                            
查看完整回答
反对 回复 2019-04-07
?
aluckdog

TA贡献1847条经验 获得超7个赞

计时器不准确的原因是,计时器只有在runLoop的一次循环中被检查,所以如果在上次循环中做了什么耗时的操作,那么计时器就被延后执行了。
正确的方法应该是新开一个线程,然后在新开的线程里设定一个timer,并执行。
__blockTestViewController*blockSelf=self;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{
blockSelf->_timer=[NSTimerscheduledTimerWithTimeInterval:1.0
target:blockSelf
selector:@selector(caculateLeftTimeForTomorrow)
userInfo:nil
repeats:YES];
[[NSRunLoopcurrentRunLoop]addTimer:blockSelf->_timerforMode:NSDefaultRunLoopMode];
[[NSRunLoopcurrentRunLoop]run];
});
                            
查看完整回答
反对 回复 2019-04-07
  • 2 回答
  • 0 关注
  • 731 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信