Уведомление об изменении времени (часы и минуты) в объекте

Есть ли лучшая практика для получения уведомления при изменении времени?

Я использую 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 для серьезных, неожиданных изменений, то есть "переход на новый день (полночь), обновление времени перевозчика и переход на летнее время или обратно".

Другие вопросы по тегам