NSTimer每30秒运行一次,但始终在xx:00sec或xx:30秒一分钟内启动

时间:2016-07-26 11:50:11

标签: ios swift nstimer

我有类似的问题:NSTimer run every minute but on first second

我希望计时器开始下一分钟的第一秒或下一半的分钟。我们假设当前时间为:12min:34sec下一个所需的开火时间为13min:00sec,如果它是12min:15sec则应该开火12min:30sec

基本上我需要在每分钟的每个xx:00secxx:30sec上触发。

这是第一秒触发的代码:我需要找到分钟和秒的正确组件

    let currentCalendar = NSCalendar.currentCalendar()
    let unitFlags: NSCalendarUnit = [.Era, .Year, .Month, .Day, .Hour, .Minute]
    let components = currentCalendar.components(unitFlags , fromDate: NSDate())
    components.minute += 1
    components.second = 0

    let nextMinuteDate = currentCalendar.dateFromComponents(components)

    let reloadTimer = NSTimer.scheduledTimerWithTimeInterval(kReloadDataTimeInterval, target: self, selector: #selector(loadData) , userInfo: nil, repeats: false)
    reloadTimer.fireDate = nextMinuteDate!

2 个答案:

答案 0 :(得分:1)

  • 创建NSTimer属性

    var timer : NSTimer!
    
  • 使用非重复计时器和计算的时间间隔(30 - (seconds-of-current-date % 30))初始化方法中的属性

    let currentSeconds = NSCalendar.currentCalendar().component(.Second, fromDate: NSDate())
    let initialInterval = NSTimeInterval(30 - currentSeconds % 30)
    timer = NSTimer.scheduledTimerWithTimeInterval(initialInterval, 
                                            target: self, 
                                          selector: #selector(firstTimerFired(_:)), 
                                          userInfo: nil, 
                                           repeats: false)
    
  • 在表示selector重新初始化计时器的方法中,以30秒的间隔重复计时器和第二个选择器。

    func firstTimerFired(aTimer : NSTimer) {
       NSLog("firstTimerFired")
       timer = NSTimer.scheduledTimerWithTimeInterval(30.0, 
                                               target: self, 
                                             selector: #selector(timerFired(_:)), 
                                             userInfo: nil, 
                                              repeats: true)
    }
    
  • 使用两个单独的选择器可以避免使用不必要的if子句来检查首次运行

    func timerFired(aTimer : NSTimer) {
      NSLog("timerFired")
    }
    

NSLog语句(而不是print)也会打印出证明日期的当前日期和时间。

答案 1 :(得分:0)

answer of @vadian启发的解决方案,但避免声明NSTimer并且必须安排定时器两次并有两个选择器

let currentSeconds  = NSCalendar.currentCalendar()
                                .component(.Second, fromDate:  NSDate())

let initialInterval = NSTimeInterval(30.0 - Double(currentSeconds) % 30.0)

let fireDate =  NSDate().dateByAddingTimeInterval(initialInterval)

let reloadTimer =  NSTimer(fireDate: fireDate,
                                interval: 30.0,
                                target: self,
                                selector: #selector(self.loadData),
                                userInfo: nil,
                                repeats: true)

NSRunLoop.mainRunLoop().addTimer(reloadTimer, forMode: NSRunLoopCommonModes)