2010-07-20 1 views
0

Voici mon code (simplifié un peu). J'ai un NSTimer tirant chaque seconde qui soustrait un de la variable counter. Lorsque l'application passe en arrière-plan, j'arrête le compteur et enregistre le temps que le compteur atteindra zéro dans une valeur NSDefault.Problème avec un compte à rebours en arrière-plan dans iOS

Cependant, lors de la restauration de l'application à partir de l'arrière-plan, lorsque je soustrais l'heure actuelle de l'heure «zéro», j'ai parfois des valeurs qui sont trop grandes. Aidez-moi à trouver le bug s'il vous plaît?

- (void)prepareToEnterBackground { 
    NSUserDefaults *defaults; 
    defaults = [NSUserDefaults standardUserDefaults]; 

    [defaults setBool:[self timerIsRunning] forKey:@"timer_is_running"]; 
    [defaults setInteger:workPlayStatus forKey:@"work_play_status"]; 
    if ([self timerIsRunning]) { 
     [defaults setFloat:([[NSDate date] timeIntervalSince1970] + (float) counter) forKey:@"timestamp_for_status_change"]; 
    } else { 
     [defaults setFloat:0.0 forKey:@"timestamp_for_status_change"]; 
    } 

    if (timer!=nil) { 
     [timer invalidate]; 
     timer = nil; 
    } 
} 

- (void)restoreFromBackground { 
    NSUserDefaults *defaults; 
    defaults = [NSUserDefaults standardUserDefaults]; 

    NSInteger remainingTimerSeconds; 
    if ([defaults integerForKey:@"timer_is_running"]) { 
     remainingTimerSeconds = (int) ([defaults floatForKey:@"timestamp_for_status_change"] - [[NSDate date] timeIntervalSince1970]); 
     if (remainingTimerSeconds <= 0) { 
      remainingTimerSeconds = 0; 
     } 
    } else { 
     remainingTimerSeconds = 0; 
    } 

    if (remainingTimerSeconds > 0) { 
     counter = remainingTimerSeconds; 
     workPlayStatus = [defaults integerForKey:@"work_play_status"]; 
     timer = [NSTimer scheduledTimerWithTimeInterval:1 
      target:self 
      selector:@selector(advanceTimer:) 
      userInfo:nil 
      repeats:YES]; 
    } 
} 
+0

quelle variable est à grande? – tadejsv

Répondre

4

Juste une supposition - le type NSTimeInterval est défini comme double et vous travaillez avec des flotteurs dans votre code afin que vous puissiez éventuellement déborder quelque part. Essayez de changer float à double, peut-être que cela aidera ...

+0

Merci beaucoup. Je dois avoir raté ça. – winsmith