2010-06-16 5 views
6

Je suis essayer de faire multi-threading en Objective C. Ce que je veux faire maintenant, c'est que, pour une instance d'objets, Je veux avoir le moyen d'appeler certains fonctionner 5 secondes plus tard. Comment puis-je faire cela?Comment planifier méthode appel en Objective C

Dans Coco 2D, c'est très facile à faire. Ils ont quelque chose appelé scheduler. En Objective C, comment le faire s'il vous plaît?

Merci

Répondre

13

Vous pouvez utiliser performSelector:withObject:afterDelay:

Par exemple:

[self performSelector:@selector(myFunc:) withObject:nil afterDelay:5.0]; 
+0

merci. + (void) cancelPreviousPerformRequestsWithTarget: (id) aTarget sélecteur: (SEL) aSelector object: (id) anArgument –

+0

Le code ci-dessus comporte une erreur, le: après l'appel du sélecteur n'est pas nécessaire pour les méthodes sans arguments. [self performSelector: @selector (myFunc) avecObject: nil afterDelay: 5.0]; – archieoi

2

Ajoutant à ce qui a été dit, si vous souhaitez passer un seul argument à myFunc, l'appel pourrait être modifié comme suit

[self performSelector:@selector(showNote:) withObject:@"S" afterDelay:1.0]; 

et si vous avez besoin d'invoquer une méthode qui prend plus de 1 argument, vous pouvez le faire en utilisant l'invocation comme indiqué dans l'extrait suivant -

SEL selector = @selector(nextPicture:); 
NSMethodSignature *signature = [[self class] instanceMethodSignatureForSelector:selector]; 
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; 
[invocation setSelector:selector]; 

//Set the arguments 
[invocation setTarget:self]; 
NSString* str = [imageNames objectAtIndex:1]; 
[invocation setArgument:&str atIndex:2]; 
[NSTimer scheduledTimerWithTimeInterval:5.0f invocation:invocation repeats:NO]; 
+1

Avant de passer à 'NSInvocation', je recommande d'utiliser' dispatch_after'. Commencez simplement à le saisir dans Xcode et acceptez l'auto-complétion, et mettez votre code à exécuter après un délai dans le bloc. – MaxGabriel

+0

bonne recommandation, merci! –

+0

dispatch_after était une excellente recommandation, et en fait quelque chose que je ne savais même pas à ce jour. C'est un extrait de code extrêmement utile, car il est beaucoup plus facile d'appeler des méthodes qui prennent un ou plusieurs arguments beaucoup plus facilement (ou plusieurs méthodes dans une rangée). Fondamentalement, un appel de bloc retardé est infiniment plus utile que de limiter à un seul sélecteur. – Corbin87

Questions connexes