Comment puis-je utiliser un NSTimer
? Quelqu'un peut-il me donner des instructions étape par étape?
Réponses
Trop de publicités?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.
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
}
#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