0

我希望每秒执行一些操作。我不希望每两秒之间的刻度是准确的。但从长远来看,我希望它们精确到平均水平。

例如,滴答声可能按如下时间顺序发生:
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 ”或......?

4

1 回答 1

0

我已经开发出一种方法来实现我的目标:

  1. 像这样创建一个线程:

    - (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);
    }

完毕。

于 2013-11-14T09:59:27.727 回答