我有类似的问题:NSTimer run every minute but on first second
我希望计时器开始下一分钟的第一秒或下一半的分钟。我们假设当前时间为:12min:34sec
下一个所需的开火时间为13min:00sec
,如果它是12min:15sec
则应该开火12min:30sec
。
基本上我需要在每分钟的每个xx:00sec
和xx: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!
答案 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)