第二个调用方法 - iOS

时间:2014-01-16 03:10:53

标签: ios objective-c time clock

我有一个显示秒钟和当前时间的时钟的方法。这个工作正常,但是这个代码会在当前秒的一半或四分之三的时间内被调用,这取决于我打开应用程序或运行它的时间。该方法通过viewDidLoad方法调用。当发生这种情况时,我的时钟将关闭近1秒钟。有没有办法在下一秒启动时启动我的方法?即当设备时间为HH:MM:SS.000时启动它?注意:对不起,如果过度使用秒和时钟会造成混淆。我的意思是我需要在HH开始我的方法:MM:SS.000(设备内部时钟)

2 个答案:

答案 0 :(得分:2)

使用:

- (id)initWithFireDate:(NSDate *)date interval:(NSTimeInterval)seconds 
    target:(id)target selector:(SEL)aSelector userInfo:(id)userInfo 
    repeats:(BOOL)repeats

对象NSTimer可能是要走的路。

添加找到的逻辑in this StackOverflow question/answers,您应该能够在确切的秒数内正确使用它。 (使用那里的逻辑来创建一个分辨率为1秒的NSDate对象,然后在我上面提到的方法中使用该日期。)

NSTimer *yourTimer = [[NSTimer alloc] initWithFireDate:nowToTheSecond 
    interval:1.0 target:self selector:@selector(updateClock) userInfo:nil
    repeats:YES];
[[NSRunLoop mainLoop] addTimer:yourTimer forMode:NSRunLoopCommonModes];

答案 1 :(得分:1)

NSTimer对象并不准确。它们依赖于频繁访问事件循环的应用程序,并且可以变化50 MS或更多(根据我在文档中读到的内容)。如果我没记错的话,他们会尝试“快速恢复”到所需的时间间隔,而不是漂移,但任何给定的射击都不会准确。

那就是说,我想我要做的是取当前的NSDate,将其转换为NSTimeInterval,取上限值(下一个更高的整数)并启动一次性计时器,此时将触发。然后在该计时器的处理程序中,启动一次一秒的计时器。像这样:

//Get the current date in seconds since there reference date.
NSTimeInterval nowInterval =[NSDate timeInervalSinceReferenceDate];

//Figure out the next even second time interval.
NSTimeInterval nextWholeSecond = ceil(nowInterval);

//Figure out the fractional time between now and the next even second
NSTimeInterval fractionUntilNextSecond = nextWholeSecond - nowInterval;

//Start a one-time timer that will go off at the next whole second.
NSTimer oneTimeTimer = [NSTimer timerWithTimeInterval: fractionUntilNextSecond 
  target: self 
  @selector: (startSecondTimer:) 
  userInfo: nil
  repeats: NO];

startSecondTimer方法:

- (void) startSecondTimer: (NSTimer *)timer;
{
  //Start a new, repeating timer that fires once per second, on the second.
  self.secondsTimer = [NSTimer timerWithTimeInterval: 1.0 
  target: self 
  @selector: (handleSecondTimer:) 
  userInfo: nil
  repeats: YES];
} 

你仍然应该在每次调用handleSecondTimer:方法时计算新的时间,而不是依赖于你被调用的次数,因为如果系统在它应该调用你的计时器时真的很忙而且可以'告诉你,它可能会完全跳过一个电话。

免责声明:我没试过这个,但它应该有效。我唯一担心的是边缘情况。例如,当下一整秒太接近现在并且一次性计时器不能足够快地发射时。向fractionUntilNextSecond值添加秒可能更安全,因此秒针不会开始运行的时间超过1秒但不到2秒。