Je pense que vous pouvez implémenter un temporisateur récurrent, rythmé toutes les 30 secondes (ne le faites pas trop vite), qui interrogera toutes les demandes en attente et mettra à jour le compte à rebours pour chaque commande et vous signalera tous les ordres ayant atteint le compte à rebours .
E.g .: disons que vous prenez une commande de 5 minutes. Ensuite, vous calculerez la date de la commande sera prête en ajoutant 5 * 60 secondes pour la date:
NSDate *orderReadyAt = [NSDate dateWithTimeIntervalSinceNow:5*60];
Ensuite, vous stockerez cette date à votre propriété date de fin de commande. Par exemple:
Order *myOrder = [[Order alloc] init];
... make your order here ...
myOrder.readyDate = orderReadyAt;
Au démarrage de l'application vous permettra de définir une minuterie récurrente qui déclenchera toutes les 30 secondes et appelle la fonction « countdownCheck »:
[NSTimer scheduledTimerWithTimeInterval:30 target:self selector:@selector(countdownCheck) userInfo:nil repeats:YES];
À ce stade, ce que vous avez à faire dans votre countdownCheck est en boucle par vos instances de commande et pour chacun d'eux calculer le temps restant:
-(void)countdownCheck {
for(Order *aOrder in allOrders) {
NSTimeInterval secondsRemaining = [aOrder.readyDate timeIntervalSinceNow];
//... do something: update your GUI, show an alert if secondsRemaining<0...
}
}
Il est clair que cette approche est pas le temps critique, le seul besoin Ce que vous avez est d'exécuter le code dans countdownCheck dans la limite de 30 secondes, ce qui est bien sûr plus que suffisant. Vous pouvez idéalement le régler à 1 seconde seulement, à condition que votre boucle soit assez rapide.
comment puis-je passer des secondes à NSDate? –
@Veer NSDate ne fonctionne pas avec les secondes, c'est une date. Si vous stockez l'heure de début dans un objet NSDate, en appelant dateObject = [[NSDate date] retain], puis appelez cette méthode pour calculer le temps restant que * devrait * être réglé –