无法让带有 firedate 的 NSTimer 在 Apple Watch 上正常工作
Cannot get NSTimer with firedate to work properly on Apple Watch
我正在尝试创建一个持续时间为 1 分钟的计时器,它每分钟重复一次,但在实际时间的下一分钟开始时开始(如 5:21:00pm)。根据我在此处找到的类似 post,我正在使用此代码:
@IBAction func switchEnabled(value: Bool) {
if(value){
let date = NSDate()
let calendar = NSCalendar.currentCalendar()
let components = calendar.components([.Year, .Hour, .Minute, .Second], fromDate: date)
components.minute += 1
components.second = 0
let nextMinuteDate = calendar.dateFromComponents(components)
let doneTimer = NSTimer(fireDate: nextMinuteDate!, interval: 60.0, target: self, selector: Selector("timerDone:"), userInfo: nil, repeats: true)
NSRunLoop.mainRunLoop().addTimer(doneTimer, forMode: NSDefaultRunLoopMode)
// still not working properly
}
else{
print("switch off")
// invalidate timer here
}
}
我的 timerDone 选择器只打印出 "Done!",但是当我 运行 在 watchOS 2 模拟器上执行此操作并激活开关时,它立即打印完成并且计时器开始计时一分钟,所以它不会等到开火日期。对这里发生的事情有什么想法吗?谢谢
class Test: UIViewController{
override func viewDidLoad() {
super.viewDidLoad()
let date = NSDate()
let calendar = NSCalendar.currentCalendar()
let components = calendar.components([.Second], fromDate: date)
let delayedStart:Double=(Double)(60-components.second)
let dispatchTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(delayedStart * Double(NSEC_PER_SEC)))
dispatch_after(dispatchTime, dispatch_get_main_queue(), {
NSTimer.scheduledTimerWithTimeInterval(60.0, target: self, selector: Selector("timerDone:"), userInfo: nil, repeats: true).fire()
})
}
func timerDone(myObj:NSObject){
print("Done")
}
}
- 要恰好在下一分钟后触发,首先您需要获取当前分钟内完成的秒数,然后从 60 中减去它以获得下一分钟。
- 一旦这些秒结束,你必须立即开火。
- 然后,你知道如何以一定的间隔(在本例中为 60 秒)重复计时器。
如果您遇到任何困难,请告诉我。
我正在尝试创建一个持续时间为 1 分钟的计时器,它每分钟重复一次,但在实际时间的下一分钟开始时开始(如 5:21:00pm)。根据我在此处找到的类似 post,我正在使用此代码:
@IBAction func switchEnabled(value: Bool) {
if(value){
let date = NSDate()
let calendar = NSCalendar.currentCalendar()
let components = calendar.components([.Year, .Hour, .Minute, .Second], fromDate: date)
components.minute += 1
components.second = 0
let nextMinuteDate = calendar.dateFromComponents(components)
let doneTimer = NSTimer(fireDate: nextMinuteDate!, interval: 60.0, target: self, selector: Selector("timerDone:"), userInfo: nil, repeats: true)
NSRunLoop.mainRunLoop().addTimer(doneTimer, forMode: NSDefaultRunLoopMode)
// still not working properly
}
else{
print("switch off")
// invalidate timer here
}
}
我的 timerDone 选择器只打印出 "Done!",但是当我 运行 在 watchOS 2 模拟器上执行此操作并激活开关时,它立即打印完成并且计时器开始计时一分钟,所以它不会等到开火日期。对这里发生的事情有什么想法吗?谢谢
class Test: UIViewController{
override func viewDidLoad() {
super.viewDidLoad()
let date = NSDate()
let calendar = NSCalendar.currentCalendar()
let components = calendar.components([.Second], fromDate: date)
let delayedStart:Double=(Double)(60-components.second)
let dispatchTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(delayedStart * Double(NSEC_PER_SEC)))
dispatch_after(dispatchTime, dispatch_get_main_queue(), {
NSTimer.scheduledTimerWithTimeInterval(60.0, target: self, selector: Selector("timerDone:"), userInfo: nil, repeats: true).fire()
})
}
func timerDone(myObj:NSObject){
print("Done")
}
}
- 要恰好在下一分钟后触发,首先您需要获取当前分钟内完成的秒数,然后从 60 中减去它以获得下一分钟。
- 一旦这些秒结束,你必须立即开火。
- 然后,你知道如何以一定的间隔(在本例中为 60 秒)重复计时器。
如果您遇到任何困难,请告诉我。