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”