Уведомление об изменении времени (часы и минуты) в объекте
Есть ли лучшая практика для получения уведомления при изменении времени?
Я использую NSTimer
он проверяет каждые 0,002 секунды, изменяется ли время (часы и минуты, а не секунды и миллисекунды), чтобы синхронизировать метку в моем приложении с часами телефона каждую минуту.
Я надеюсь, что есть лучшее решение.
Спасибо
2 ответа
Если вы просто хотите обновить, когда меняется минута, это должно помочь:
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
:
}
Вы также можете обновить свой пользовательский интерфейс в ответ на UIApplicationSignificantTimeChangeNotification
для серьезных, неожиданных изменений, то есть "переход на новый день (полночь), обновление времени перевозчика и переход на летнее время или обратно".