NSTimer每分钟运行一次,但在第一秒钟

我有NSTimer每分钟运行一次的经验,就像

NSTimer.scheduledTimerWithTimeInterval(60.0, target: self, selector: Selector("everyMinute"), userInfo: nil, repeats: true) 

是否有可能使用NSTimer,其他类或其他控件,每分钟运行一些方法,但在第一分钟?

我有一些想法如何实现它自己,但我首先检查是否已经存在?

一种方法是使用NSCalendar计算当前的下一分钟,并安排定时器从该定时器开始,手动调度runLoop

 let date = NSDate() let calendar = NSCalendar.currentCalendar() let components = calendar.components(NSCalendarUnit.CalendarUnitEra|NSCalendarUnit.CalendarUnitYear|NSCalendarUnit.CalendarUnitMonth|NSCalendarUnit.CalendarUnitDay|NSCalendarUnit.CalendarUnitHour|NSCalendarUnit.CalendarUnitMinute, fromDate: date) components.minute += 1 components.second = 1 let nextMinuteDate = calendar.dateFromComponents(components) let timer = NSTimer(fireDate: nextMinuteDate!, interval: 60, target: self, selector: Selector("everyMinute"), userInfo: nil, repeats: true) NSRunLoop.mainRunLoop().addTimer(timer, forMode: NSDefaultRunLoopMode) 

NSDate方法timeIntervalSinceReferenceDate返回自2001年1月1日格林威治标准时间12:00 am以来的秒数。 它包括一秒的几分之一

如果你这样称呼,除以60,拿出底价,然后乘以60,它应该给你当前“圆整分钟”的时间间隔。 加60,你就会得到下一个“round minute”的时间间隔,加1,THER,在下一个“round minute”之后,你会得到一秒的时间间隔。

代码可能看起来像这样:

 NSTimeInterval now = [NSDate timeIntervalSinceReferenceDate]; NSTimeInterval nextMinute = floor(now/60)*60 + 61 //time interval for next minute, plus 1 second NSTimeInterval delay = nextMinute - now; //Delay now contains the number of seconds until the next "round minute", plus 1 second. dispatch_after( dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delay * NSEC_PER_SEC)), dispatch_get_main_queue(), ^ { //Replace the code below with whatever target/userInfo you need. [NSTimer scheduledTimerWithTimeInterval: 60 target: self userInfo: nil; repeats: YES]; } ); 

编辑:实际上,一分钟的“第一秒”是零秒,所以你应该把上一次计算的代码中的+61 nextMinute “+60”,而不是“+61”