我可以在OS X编程中获得时钟秒刻度事件吗?

时间:2013-09-23 01:33:22

标签: xcode macos timer

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

例如,刻度可能按时间顺序发生,如下所示:
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 ”或......?

1 个答案:

答案 0 :(得分:0)

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

  1. 创建一个类似于此的线程:

    - (void)_threadHandleTick:(id)arg
    {
        while(...)
        {
            @autoreleasepool
            {
                [self sleepToNextSecond];
                ...     /* Do what ever you like or raise a noification */    
            }
        }
    }
    
  2. 然后 - 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);
        }
    

    完成。