Wie kann ich über eine Änderung der Systemzeit in meiner Cocoa-Anwendung benachrichtigt werden?

8

Ich habe eine Cocoa-Anwendung, die Datumsstempel für Ereignisse aufzeichnet. Ich muss wissen, wann die Systemzeit zurückgesetzt wird und um wie viel, aber ich kann anscheinend nirgendwo eine Benachrichtigung fällen, die mir sagt, dass so etwas passiert ist. Diese Änderung kann auftreten, weil NTP die Uhr zurückgesetzt hat oder weil der Benutzer zurückgesetzt wurde (z. B. aus den Systemeinstellungen). Es wäre großartig, wenn es nur eine NSNotifikation geben würde, die ich registrieren könnte, aber ich bin offen für irgendwelche Vorschläge.

    
c-had 27.03.2009, 15:55
quelle

4 Antworten

14

Apple hat in NSSystemClockDidChangeNotification , einem Teil von NSDate, in Snow Leopard (10.6) hinzugefügt. Es scheint keine Möglichkeit zu geben, dies in Leopard (10.5) oder früher zu tun. In den Apple NSDate-Dokumenten :

  

Wird gepostet, wenn die Systemuhr geändert wird. Dies kann durch einen Aufruf von settimeofday () oder durch das Ändern von Werten im Datums- und Uhrzeiteinstellungen-Bedienfeld ausgelöst werden. Das Benachrichtigungsobjekt ist null. Diese Benachrichtigung enthält kein userInfo-Wörterbuch.

Dies scheint Ihnen nicht zu sagen, wie viel Zeit sich geändert hat. Sie könnten das möglicherweise durch periodische (sagen wir alle 5 Sekunden in einem NSTimer) Erfassen der Systemzeit mit [NSDate date] berechnen, indem Sie es in eine Variable speichern und dann, nachdem NSSystemClockDidChangeNotification ausgelöst wurde, das neue Datum nehmen und die beiden zusammen mit NSDate vergleichen timeIntervalSinceDate: Methode, um den Unterschied zu bekommen.

Nicht Millisekunde oder sogar Sekunde genau, aber ziemlich nah.

BEARBEITEN: Siehe diesen Beitrag . Sie könnten möglicherweise den Befehl UpTime() C verwenden, um die Systembetriebszeit in CPU-Tics zu erfassen (die Sie später in Sekunden konvertieren können). Sie können dies verwenden, um herauszufinden, wie viel Zeit sich geändert hat (unter der Annahme, dass kein System neu gestartet oder inaktiv ist). Dies funktioniert auch, wenn die Systemuhr vom Benutzer- oder Netzwerkzeitprotokoll geändert wird.

    
Dave Gallagher 26.10.2009, 02:39
quelle
10

Wenn einige auf der Suche nach der Lösung wissen System Datum ändern Ereignis von 10.4

ändern %Vor%
Girish Kolari 29.07.2010 14:08
quelle
1

Die Zeit bewegt sich ständig. Eine Benachrichtigung jedes Mal, wenn sich die aktuelle Zeit ändert, wäre ein konstanter CPU-Einweichen-Strom von Benachrichtigungen.

Sie müssen die aktuelle Uhrzeit in Ihrem Ereignishandler abrufen, der die Ereignisse empfängt, für die Sie einen Datumsstempel erstellen. Sie erhalten die aktuelle Uhrzeit durch Aufruf von [NSDate date] .

    
Peter Hosey 27.03.2009 16:24
quelle
0

Ich glaube nicht, dass es einen einzigen Weg dafür gibt, aufgrund der verschiedenen Mechanismen, durch die sich die Zeit ändern könnte. Aber es wäre nicht sehr teuer (zu teuer? Weiß nicht, hast du es schon profiliert? ;-) um ein NSTimer einmal pro Sekunde zu setzen, um die Zeit zu überprüfen und mit dem vorherigen Wert zu vergleichen. Wenn es nicht um eine Sekunde fortgeschritten ist, ist etwas Interessantes passiert und Sie können Ihr Audit-Objekt benachrichtigen.

    
user23743 27.03.2009 20:27
quelle

Tags und Links