Как я могу получить уведомление об изменении системного времени в моем приложении Какао? - PullRequest
9 голосов
/ 27 марта 2009

У меня есть приложение Какао, которое записывает даты на события. Мне нужно знать, когда системное время сбрасывается и на сколько, но я не могу оштрафовать уведомление в любом месте, которое говорит мне, что такое произошло Это изменение может произойти из-за того, что NTP сбрасывает часы или из-за сброса пользователя (например, из Системных настроек). Было бы замечательно, если бы я мог зарегистрироваться только для получения 1001 *, но я открыт для любых предложений.

Ответы [ 4 ]

15 голосов
/ 26 октября 2009

Apple добавлена ​​в NSSystemClockDidChangeNotification , часть NSDate, в Snow Leopard (10.6). Кажется, нет способа сделать это в Leopard (10.5) или ранее. Согласно Apple NSDate документы :

Размещается при каждом изменении системных часов. Это может быть инициировано вызовом settimeofday () или изменением пользователем значений на панели предпочтений даты и времени. Объект уведомления пуст. Это уведомление не содержит словаря userInfo.

Это не говорит вам, "сколько" времени изменилось. Вы можете рассчитать это, периодически (скажем, каждые 5 секунд в NSTimer), записывая системное время с помощью [NSDate date], сохраняя его в переменной, а затем после срабатывания NSSystemClockDidChangeNotification, захватывайте новую дату и сравнивайте два вместе, используя NSDate timeIntervalSinceDate: метод, чтобы получить разницу.

Не с точностью до миллисекунды или даже секунды, но довольно близко.

РЕДАКТИРОВАТЬ: См. этот пост . Вы могли бы использовать команду UpTime() C, чтобы получить время работы системы в тиках процессора (которые вы можете позже преобразовать в секунды). Вы можете использовать это, чтобы выяснить, сколько времени изменилось (при условии отсутствия перезагрузки системы или сна). Это работает, даже если системные часы изменены пользовательским или сетевым протоколом времени.

10 голосов
/ 29 июля 2010

Если кто-то ищет решение, узнайте событие изменения системной даты с 10.4


OSStatus DateChangeEventHandler(EventHandlerCallRef nextHandler, EventRef theEvent, void *userData) 
{
    NSLog(@"Event received!\n");    
    return 0;
}


- (void)SystemTimeChangeHandler
{
    EventTypeSpec eventType;
    eventType.eventClass = kEventClassSystem;
    eventType.eventKind = kEventSystemTimeDateChanged;

    EventHandlerUPP eventHandlerUPP =
    NewEventHandlerUPP(DateChangeEventHandler);
    EventHandlerRef eventHandlerRef = NULL;
    (void)InstallApplicationEventHandler(
                                         eventHandlerUPP,
                                         1,
                                         &eventType,
                                         self,
                                         &eventHandlerRef);

}

1 голос
/ 27 марта 2009

Время постоянно движется. Уведомление каждый раз, когда текущее время изменяется, будет постоянным, пропитывающим процессор потоком уведомлений.

Что вам нужно сделать, это получить текущее время в вашем обработчике событий - тот, который получает события, на которые вы ставите метки. Вы получите текущее время, позвонив по номеру [NSDate date].

0 голосов
/ 27 марта 2009

Я не думаю, что есть единственный способ сделать это из-за различных механизмов, с помощью которых время может измениться. Но это не будет очень дорого (слишком дорого? Не знаю, вы его уже профилировали? Если он не продвинется примерно на секунду, произошло что-то интересное, и вы можете уведомить свой объект аудита.

...