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

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

Я использую NSTimer, который каждые 0,002 секунды проверяет, изменилось ли время (часы и минуты, а не секунды и миллисекунды), чтобы поддерживать синхронизацию метки в моем приложении с часами телефона каждую минуту.

Я надеюсь, что есть лучшее решение.

Спасибо


person Giorgio Dalvit    schedule 26.05.2015    source источник
comment
NSTimer - хорошее решение для вашей задачи, и вы также можете прослушивать UIApplicationSignificantTimeChangeNotification (отправляемое, когда пользователь устанавливает время в настройках). Однако, если интервал вашего таймера настолько мал, вам не нужно следить за уведомлениями.   -  person Alexander Tkachenko    schedule 26.05.2015


Ответы (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)];
}
person Fennelouski    schedule 26.05.2015
comment
Модификация вашего решения, извлекающая компонент секунд из даты, тоже не работает. Решение, которое я принял с NSTimer, работает, но не обновляет метку мгновенно, как я ожидал. - person Giorgio Dalvit; 27.05.2015
comment
попробуйте обновить метку в основном потоке, вызвав [self performSelectoronMainThread: @selector (updateLabel) withObject: nil]; - person Rahul Vyas; 27.05.2015

Установите повторяющийся таймер, начиная с следующей минуты:

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

person jrc    schedule 25.02.2016