344 votes

Comment puis-je utiliser NSTimer?

Comment puis-je utiliser un NSTimer? Quelqu'un peut-il me donner des instructions étape par étape?

616voto

Alex Rozanski Points 26107

Tout d'abord, je voudrais attirer votre attention sur le Cacao/CF documentation (qui est toujours un grand premier port d'escale). La Pomme docs ont une section en haut de chaque article de référence, appelé "Guides d'accompagnement", qui répertorie les guides pour le sujet d'être documenté (le cas échéant). Par exemple, avec NSTimer, la documentation des listes deux guides d'accompagnement:

Pour votre situation, la Programmation des Sujets de l'article est susceptible d'être le plus utile, alors que le filetage sujets sont liés, mais pas la plus directement liée à la classe d'être documenté. Si vous jetez un oeil à la Programmation des Sujets d'article, il est divisé en deux parties:

  • Minuteries
  • Utilisation Des Chronomètres

Pour les articles qui utilisent ce format, il y a souvent une vue d'ensemble de la classe et qu'il est utilisé pour, et puis un exemple de code sur la façon de l'utiliser, dans ce cas, les "Timers". Il y a des sections "Création et Planification d'une Minuterie", "Arrêt d'un Timer" et "Gestion de la Mémoire". À partir de l'article, la création d'un planifiée, la non-répétition de minuterie peut être fait quelque chose comme ceci:

[NSTimer scheduledTimerWithTimeInterval:2.0
    target:self
    selector:@selector(targetMethod:)
    userInfo:nil
    repeats:NO];

Cela va créer un chronomètre est déclenché après 2,0 secondes et des appels targetMethod: sur self avec un argument, qui est un pointeur vers l' NSTimer de l'instance.

Ensuite, si vous voulez regarder plus en détail la méthode, vous pouvez vous référer à la documentation pour plus d'informations, mais il y a une explication à travers le code de trop.

Si vous souhaitez arrêter la minuterie, ce qui est l'un qui se répète, ou arrêter d'un non-répétition de minuterie avant d'incendies), alors vous avez besoin de garder un pointeur vers l' NSTimer de l'instance qui a été créée; le plus souvent, ce devra être une variable d'instance, de sorte que vous pouvez vous référer à une autre méthode. Vous pouvez ensuite appeler invalidate sur le NSTimer exemple:

[myTimer invalidate];
myTimer = nil;

C'est aussi une bonne pratique de nil la variable d'instance (par exemple, si votre méthode qui invalide la minuterie est appelé plus d'une fois, et la variable d'instance n'a pas été mis à l' nil et de la NSTimer instance a été libéré, il va lever une exception).

Noter également le point sur la Gestion de la Mémoire au bas de l'article:

Car la course de la boucle de maintient de la minuterie, du point de vue de la gestion de la mémoire il n'y a généralement pas besoin de faire référence à une minuterie après que vous avez programmée. Depuis la minuterie est passé comme argument lorsque vous spécifiez sa méthode comme un sélecteur, vous pouvez invalider une répétition de minuterie lorsque approprié à l'intérieur de cette méthode. Dans de nombreux cas, cependant, vous voulez aussi avoir la possibilité de l'invalider, de la minuterie et peut-être même avant qu'il ne commence. Dans ce cas, vous avez besoin de garder une référence à la minuterie, de sorte que vous pouvez envoyer un invalider message à chaque fois que nécessaire. Si vous créez un imprévu de la minuterie (voir "non programmée de la vieille"), alors vous devez maintenir une référence forte à la minuterie (en référence compte de l'environnement, vous le conserver), de sorte qu'il n'est pas libéré avant de l'utiliser.

331voto

Woofy Points 3266

il ya un couple de façons d'utiliser une minuterie:

1) programmé la minuterie et à l'aide du sélecteur

NSTimer *t = [NSTimer scheduledTimerWithTimeInterval: 2.0
                      target: self
                      selector:@selector(onTick:)
                      userInfo: nil repeats:NO];
  • si vous définissez le répète PAS, le compte à rebours va attendre 2 secondes avant de lancer le sélecteur et d'après ce qu'il s'arrête;
  • si le répète: OUI, le compte à rebours va commencer immédiatement répété à l'appelant le sélecteur toutes les 2 secondes;
  • pour arrêter la minuterie vous appelez de la minuterie -méthode invalidate: [t invalider];

Comme une note de côté, au lieu d'utiliser une minuterie qui ne se répètent pas et appelle le sélecteur après un intervalle spécifié, vous pouvez utiliser une simple déclaration comme ceci:

[self performSelector:@selector(onTick:) withObject:nil afterDelay:2.0];

cela aura le même effet que l'exemple de code ci-dessus; mais si vous voulez appeler le sélecteur de chaque nième fois, vous utilisez la minuterie avec des répétitions:OUI;

2) l'auto-programmé la minuterie

NSDate *d = [NSDate dateWithTimeIntervalSinceNow: 60.0];
NSTimer *t = [[NSTimer alloc] initWithFireDate: d
                              interval: 1
                              target: self
                              selector:@selector(onTick:)
                              userInfo:nil repeats:YES];

NSRunLoop *runner = [NSRunLoop currentRunLoop];
[runner addTimer:t forMode: NSDefaultRunLoopMode];
[t release];
  • cela va créer un timer qui va commencer à lui-même sur une date personnalisé spécifié par vous-même (dans ce cas, au bout d'une minute), et se répète chaque une seconde

3) non programmée de la minuterie et de l'utilisation de l'invocation

NSMethodSignature *sgn = [self methodSignatureForSelector:@selector(onTick:)];
NSInvocation *inv = [NSInvocation invocationWithMethodSignature: sgn];
[inv setTarget: self];
[inv setSelector:@selector(onTick:)];

NSTimer *t = [NSTimer timerWithTimeInterval: 1.0
                      invocation:inv 
                      repeats:YES];

et après cela, vous démarrez le chronomètre manuellement chaque fois que vous avez besoin, comme ceci:

NSRunLoop *runner = [NSRunLoop currentRunLoop];
[runner addTimer: t forMode: NSDefaultRunLoopMode];



Et comme une note, onTick: méthode ressemble à ceci:

-(void)onTick:(NSTimer *)timer {
   //do smth
}

59voto

ennuikiller Points 28005

Quelque chose comme ceci:

NSTimer *timer;

    timer = [NSTimer scheduledTimerWithTimeInterval: 0.5
                     target: self
                     selector: @selector(handleTimer:)
                     userInfo: nil
                     repeats: YES];

5voto

Dan Points 859
#import "MyViewController.h"

@interface MyViewController ()

@property (strong, nonatomic) NSTimer *timer;

@end

@implementation MyViewController

double timerInterval = 1.0f;

- (NSTimer *) timer {
    if (!_timer) {
        _timer = [NSTimer timerWithTimeInterval:timerInterval target:self selector:@selector(onTick:) userInfo:nil repeats:YES];
    }
    return _timer;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    [[NSRunLoop mainRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
}

-(void)onTick:(NSTimer*)timer
{
    NSLog(@"Tick...");
}

@end

5voto

Mohit Popat Points 907
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:60 target:self selector:@selector(timerCalled) userInfo:nil repeats:NO];

-(void)timerCalled
{
     NSLog(@"Timer Called");
     // Your Code
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X