2017-10-14 13 views
0

Je me demandais s'il y avait une façon propre de faire un compte à rebours avec Grand Central Dispatch (puis afficher par exemple dans un UILabel) qui est synchronisé avec l'horloge système ... basé sur une date de référence? - Donc, si ma date de référence est NSDate dans 20 minutes, j'aurais un compte à rebours affiché en secondes (ne vous inquiétez pas du formatage) synchronisé avec l'horloge système. Faire simplement une version rapide de cette saute des secondes de temps en temps dans le cas où l'appel de la méthode de mise à jour n'arrive pas dans les délais prévus.Compte à rebours synchronisé avec `NSTimeInterval` sans sauter les secondes? (probablement en raison de l'arrondissement)

Pour moi, cela semble être une question assez simple, donc je cherche idéalement une solution de base/propre en plus d'augmenter l'intervalle de mise à jour à 10x ou quelque chose. La solution ne doit pas utiliser NSTimer.

+0

Exécutez une NSTimer répétée avec un intervalle de moins d'une seconde, disons une demi-seconde. Chaque fois que la minuterie se déclenche, mettez à jour votre étiquette en fonction de l'intervalle de temps depuis votre début (ou fin) 'NSDate' – Paulw11

+2

Vous venez de voir que vous ne voulez pas utiliser' NSTimer' - Pourquoi? – Paulw11

+0

Je pense que vous devriez utiliser 'NSTimer' –

Répondre

0

Je voudrais utiliser une méthode récursive comme ceci:

- (void) updateTimer{ 

    NSDate *now = [NSDate date]; 
    NSTimeInterval secondsToDate = [now timeIntervalSinceDate:self.referenceDate]; 
    _timerLabel.text = [NSString stringWithFormat:@"%.0f", secondsToDate]; 

    if(secondsToDate < 0){ 
     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ 
      [self updateTimer]; 
     }); 
    }else{ 
     NSLog(@"Timer triggered!"); 
    } 
} 

Il vous suffit d'appeler la première fois, il mettra à jour le compte à rebours toutes les 0,1 secondes.

+0

J'ai spécifiquement mentionné dans le post: "Pour moi, cela semble être une question assez simple, donc je cherche idéalement une solution de base/propre en plus d'augmenter l'intervalle de mise à jour pour être 10x ou quelque chose." ... C'est essentiellement ce que vous avez fait ici. –