我希望每秒执行一些操作。我不希望每两秒钟之间的刻度是准确的。但从长远来看,我希望它们能够达到平均值。
例如,刻度可能按时间顺序发生,如下所示:
0.999,2.005,2.995,3.950,5.012,... 999.01,1000.011,...
函数可能不会每秒执行一次,但从长远来看,平均不会有(或足够小)错误。
一种简单的方法是使用NSTimer。但是存在一个问题:如果CPU比率很高,NSTimer会发出微弱的延迟。例如,它可能会像这样的序列触发:
1.001,2.002,3.004,4.005,5.006,... 999.999,1001.001,...
随着时间的推移,时间误差可能会越来越大。
因此,有没有办法在Xcode中捕获任何时间流逝事件?像“ NSTimeNotificationSecondPassed ”或......?
答案 0 :(得分:0)
我已经开发出一种方法来实现我的目标:
创建一个类似于此的线程:
- (void)_threadHandleTick:(id)arg
{
while(...)
{
@autoreleasepool
{
[self sleepToNextSecond];
... /* Do what ever you like or raise a noification */
}
}
}
然后 - sleepToNextSecond 方法:
- (void)sleepToNextSecond
{
NSDateFormatter *microSecondFormat = [[NSDateFormatter alloc] init];
[microSecondFormat setDateFormat:@"SSSSSS"];
NSString *microSecondString = [microSecondFormat stringFromDate:[NSDate date]];
useconds_t microSeconds = 1000000 - ((useconds_t)[microSecondString integerValue]);
usleep(microSeconds);
}
完成。