是否有最佳实践在时间更改时获取通知?
如果时间更改(小时和分钟,而不是秒和毫秒),我正在使用NSTimer
每 0,002 秒检查一次,以使我的应用程序中的标签每分钟与电话时钟保持同步。
我希望有更好的解决方案。
谢谢
是否有最佳实践在时间更改时获取通知?
如果时间更改(小时和分钟,而不是秒和毫秒),我正在使用NSTimer
每 0,002 秒检查一次,以使我的应用程序中的标签每分钟与电话时钟保持同步。
我希望有更好的解决方案。
谢谢
如果您只想在分钟更改时更新,这应该可以解决问题:
NSDate *date = [NSDate date];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *dateComponents = [calendar components:NSHourCalendarUnit fromDate:date];
[self performSelector:@selector(minuteHasChanged) withObject:nil afterDelay:(60 - dateComponents.minute)];
而且,如果您可以确定只调用此方法一次,那么您可以执行以下操作:
- (void)minuteHasChanged {
//do stuff
NSDate *date = [NSDate date];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *dateComponents = [calendar components:NSHourCalendarUnit fromDate:date];
[self performSelector:@selector(minuteHasChanged) withObject:nil afterDelay:(60 - dateComponents.minute)];
}
设置从下一整分钟开始的循环计时器:
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
let nextMinuteDate = NSCalendar.currentCalendar().nextDateAfterDate(NSDate(), matchingUnit: .Second, value: 0, options: [.MatchNextTime])!
self.minuteDidChangeTimer = NSTimer(fireDate: nextMinuteDate, interval: 60.0, target: self, selector: "minuteDidChangeTimer:", userInfo: nil, repeats: true)
NSRunLoop.currentRunLoop().addTimer(self.minuteDidChangeTimer, forMode: NSDefaultRunLoopMode)
:
}
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(animated)
self.minuteDidChangeTimer.invalidate()
self.minuteDidChangeTimer = nil
:
}
您可能还希望更新您的 UI 以响应UIApplicationSignificantTimeChangeNotification
重大的意外更改,即“更改为新的一天(午夜)、运营商时间更新以及更改为夏令时或取消夏令时”。