2016-12-06 45 views
0

我正在使用下面的代码在2秒内更新一个用户界面50次,这给出了0.04个时间间隔。然而,updateLabels方法只有5次或6次调用,有时远不是50次。这是因为我阻止了任何东西的主线?你们知道如何使它工作吗?NSTimer不安排足够多的选择器的时间

self.timer = [NSTimer timerWithTimeInterval:0.04 
            target:self      
            selector:@selector(updateLabels) 
            userInfo:nil 
            repeats:YES]; 
[[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes]; 
+2

您应该阅读'NSTimer'的文档。关于重复计时器是如何工作的,有一个全面的讨论。 – rmaddy

+0

你怎么知道updateLabels被称为5-6次?是否有可能在该方法内运行持续40ms以上的代码? – icould

回答

2

就像轮询不好一样,反复推动也是不好的。

正如@rmaddy所说,阅读关于定时器的文档以及它们如何工作。

相反,我建议:

  • 指示时间
  • 做一个更新
  • 当更新完成后,请检查时间流逝
  • 如果>比更新间隔,做一个更新
  • if < than update interval,do a late update

请记住,以上可能不是你想要的,或者。如果您正在更新UIKit视图,则可能会合并更新并在后台线程上进行绘制。即当更新计算完成时,屏幕可能未完全绘制。

而且,你真的不想做更新N次第二除非数据真是日新月异,迅速。如果它正在迅速改变,那么请查看CADisplayLink并构建您的代码以针对每秒特定帧数的更新速率。如果它没有那么快地改变,那么只有当数据改变时才更新;重绘同样的东西是浪费电池寿命。