2016-09-01 1 views
2

J'ai un NSTimer dans mon VC et son fonctionnement bien son emplacement d'envoi d'utilisateur et je ne peux pas l'invalider sur viewDidDisappear comme je dois envoyer en arrière-plan aussi.Invalider NSTimer après VC est changé

myTimer=[NSTimer scheduledTimerWithTimeInterval:2.0 target: self 
               selector: @selector(sendDataToSocket) userInfo: nil repeats: YES]; 

Mais la question est quand j'instancier même VC à nouveau, il commence la NSTimer à nouveau et 2 minuteries fonctionnent. alors comment puis-je arrêter la précédente ou toute autre solution

Toute aide sera appréciée Merci

+0

Si votre minuteur est encore actif mais que votre VC se désalloue, je pense qu'il va se bloquer car le délégué du minuteur a été désalloué ... – ddb

+0

Parce que je dois envoyer l'emplacement quand il est en arrière-plan ou tout autre écran .. Et il n'y a pas de crash question –

Répondre

1

Vous pouvez utiliser la classe singleton ou une utilisation simple de la classe appDelegate de déclarer que l'objet myTimer dans appDelegate et utilisez-le dans votre viewController.

Cela aura un seul objet de minuterie et vous n'avez pas besoin de créer plusieurs objets et votre objectif final sera résolu. J'espère que cela t'aides! Pourquoi ne pas l'invalider à viewDidDisappear?

+0

dois-je prendre seulement mytimer comme propriété dans AppDelegate –

+0

Oui, vous devez ajouter dans AppDelegate –

0

vous devez gérer le mécanisme d'instanciation de minuterie dans votre AppDelegate

donc, dans votre ViewController, chaque fois que vous instancier, vous pouvez appeler

[((YourAppDelegate*)[UIApplication sharedApplication].delegate) startMyTimer:self]; 

startMyTimer pourrait être défini comme celui-ci

-(void)startMyTimer:(id)aTarget 
{ 
    if(myTimer) 
    { 
     [myTimer invalidate]; 
     myTimer = nil; 
    } 
    myTimer = [NSTimer scheduledTimerWithTimeInterval: 2.0 
               target: aTarget 
              selector: @selector(sendDataToSocket) 
              userInfo: nil 
               repeats: YES]; 
} 

si vous êtes sûr que seul un myTimer est toujours activé dans votre application et vous pouvez appeler votre sendDataToSocket de ViewController

+0

Une question dans mon esprit est que je prends mytimer comme @property et quand jamais j'instancie ce vc à ce moment-là si j'invalide d'abord et puis à nouveau didload il commencera –

+0

Vous avez deux choix: (1) le premier est d'invalider le premier myTimer que vous démarrez lorsque le VC appartient à * dies * ou (2) pour le déplacer ailleurs où il peut vivre pour toujours car le gestionnaire * ne meurt jamais *. En fait, si vous instanciez de nouveau votre VC, alors vous n'avez plus aucune référence au premier myTimer, donc vous avez deux myTimers fonctionnant, comme vous l'avez déjà dit. – ddb

+0

Comment donner la méthode selector sendDataToSocket son pas dans AppDelegate .. –