Benachrichtigung zu einem bestimmten Zeitpunkt

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Benachrichtigung zu einem bestimmten Zeitpunkt

    Hi,
    ich versuche zur Zeit in meinem Cocoa Programm eine Benachrichtigung zu einem bestimmten Zeitpunkt zu realisieren. Das heisst ich will zum Beispiel am 1.1.2010 eine Methode aufrufen.

    Ich habe die Realisierung jetzt erstmal mit einem NSTimer gemacht. Jedoch ist bei einem NSTimer ja das Problem, dass der Timer nicht weiterläuft wenn zum Beispiel der Mac schläft.

    Nun meine Frage: Wie realisiere ich am Besten mein gewünschtes Verhalten? Gibt es was anderes als NSTimer? Oder nutze ich am Besten den NSTimer und aktualisiere immer die Restlaufzeit nach dem Aufwachen?
    Wenn das händische Aktualisieren der Restlaufzeit die beste Möglichkeit ist, würde ich auch gerne wissen, wie ich das Aufwachen des Macs im Code mitbekommen kann.

    Ich hoffe ihr könnt mir helfen.
    Vielen Dank schon mal.

    Viele Grüße

    Christian

  • wenn du deinen timer mit

    Quellcode

    1. initWithFireDate:interval:target:selector:userInfo:repeats:

    initialisierst und dann in den ruhezustand gehst und irgendwann wieder aufwachst (vor dem firedatum) dann feuert der timer um die zeit die der ruhezustand gedauert hat später? Das glaub ich jetzt nicht!

    Genau so ist es.
  • Original von saiko

    wenn du deinen timer mit

    Quellcode

    1. initWithFireDate:interval:target:selector:userInfo:repeats:

    initialisierst und dann in den ruhezustand gehst und irgendwann wieder aufwachst (vor dem firedatum) dann feuert der timer um die zeit die der ruhezustand gedauert hat später? Das glaub ich jetzt nicht!

    Genau so ist es.

    Immer noch? Das habe ich schon 2004 an den Bugtracker gemeldet.

    Quick and dirty aus altem code.

    Quellcode

    1. @implementation NSTimer (MSTSleepAdditions)
    2. - (void) registerForSleepEvents
    3. {
    4. [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self
    5. selector:@selector(doWillSleepNotification:)
    6. name:NSWorkspaceWillSleepNotification
    7. object:nil];
    8. [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self
    9. selector:@selector(doDidWakeNotification:)
    10. name:NSWorkspaceDidWakeNotification
    11. object:nil];
    12. // [self retain];
    13. }
    14. - (void) unregisterForSleepEvents
    15. {
    16. [[[NSWorkspace sharedWorkspace] notificationCenter] removeObserver:self];
    17. // [self release];
    18. }
    19. - (void) doWillSleepNotification:(id)context
    20. {
    21. NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    22. // Datum für diesen Timer merken:
    23. if(gTimerDict == nil)
    24. {
    25. gTimerDict = [[NSMutableDictionary alloc] initWithCapacity:10];
    26. }
    27. [gTimerDict setObject:[self fireDate] forKey:[NSNumber numberWithInt: (UInt32)self]];
    28. MST_log(@"will sleep %d fire %@",(UInt32)self,[self fireDate]);
    29. [pool release];
    30. }
    31. - (void) doDidWakeNotification:(id)context
    32. {
    33. NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    34. // Datum für diesen Timer setzen:
    35. [self setFireDate:[gTimerDict objectForKey:[NSNumber numberWithInt: (UInt32)self]]];
    36. MST_log(@"did wake %d fire %@ (%@)",(UInt32)self,[self fireDate],[gTimerDict objectForKey:[NSNumber numberWithInt: (UInt32)self]]);
    37. // Datum aus dem Dictionary löschen:
    38. [gTimerDict removeObjectForKey:[NSNumber numberWithInt: (UInt32)self]];
    39. if([gTimerDict count] == 0)
    40. {
    41. [gTimerDict release];
    42. gTimerDict = nil;
    43. }
    44. [pool release];
    45. }
    46. @end
    Alles anzeigen
    Man macht einfach solange irgendwelche Dinge, bis man tot ist.
    Und dann bekommen die anderen Kuchen.