2011-03-31 1 views
1

J'essaie d'appeler une méthode à une certaine date et heure (en utilisant un NSDate) mais je ne peux pas m'expliquer comment le faire.Appel d'une méthode à NSDate

Je ne veux pas utiliser NSTimer car cela devient suspendu lorsque l'application passe en arrière-plan ou est fermée. Je ne veux pas en mettre un en arrière-plan non plus parce que cela ne résout que la moitié du problème et que c'est un gaspillage à mon avis. Je pensais que si je pouvais tirer une méthode à un NSDate à l'avenir, lorsque l'application est ouverte à nouveau, je peux voir si la date actuelle a dépassé la date d'incendie et donc si l'appeler immédiatement ou continuer à attendre.

Je suppose que je cherche quelque chose comme UILocalNotification, sans la notification. Je souhaite qu'il y ait une manière simple de faire ceci que je ne peux pas sembler trouver, ainsi n'importe quelle aide serait considérablement appréciée.

Répondre

1

Au début, il m'a semblé que vous voulez la méthode performSelector:withObject:afterDelay:. Donc, vous avez un NSDate *date lorsque vous voulez appeler le sélecteur.

NSTimeInterval delay = [date timeIntervalSinceNow]; 
[self performSelector:@selector(methodToFire) withObject:nil afterDelay:delay]; 

Bien sûr, cela ne sera pas vivre au-delà de votre exécution, de sorte que vous avez à peu près ce que vous devez Outlined faire déjà. Vous venez de sauvegarder votre date quelque part (il y a BEAUCOUP de façons de le faire), puis vérifiez par contre dans applicationDidBecomeActive. Vous pouvez utiliser la même méthode timeIntervalSinceNow que j'ai utilisée ci-dessus. (Si la date est passée, l'intervalle sera négatif.)

if ([date timeIntervalSinceNow] <= 0) { 
    // do something... 
} 
+0

Oui, je pense que c'est ce que je vais utiliser. J'espérais qu'il y aurait un 'performSelector: withObject: atDate:' mais je pense que j'espérais quelque chose qui n'est pas là. :-) Une raison d'utiliser '[self performSelector: @selector (methodToFire) avecObject: nil afterDelay: delay];' sur 'NSTimer'? – Baza207

+0

Pas que je puisse penser, le minuteur est plus de code, je pense, mais offre plus de flexibilité (dont vous n'avez probablement pas besoin). – livingtech

1

Pourquoi ne pas simplement utiliser le NSTimer, et dans le ... rappel

- (void)applicationDidBecomeActive:(UIApplication *)application 

, vérifiez l'heure et la date, et mettre à jour la minuterie, ou appelez la fonction si la date est passée.

+0

Je veux essayer autant que possible de rester à l'écart des minuteries pour maintenir les performances au maximum. Toute raison pour utiliser 'NSTimer' sur' [self performSelector: @selector (methodToFire) withObject: nil afterDelay: délai]; '? – Baza207

+1

@ Baza207 Pour que vous puissiez continuer à mettre à jour votre interface utilisateur, sans avoir à gérer les threads. (Aussi, un NSTimer avec un débit de feu lent est très performant, Id assurez-vous de profiler avant d'optimiser prématurément.) –

+0

Ah Oki. Cela aide ma décision. Merci beaucoup pour votre aide. :-D – Baza207