88 votes

Ajout d'un délai entre l'exécution des deux lignes suivantes

J'ai besoin d'ajouter un délai entre l'exécution de deux lignes dans une (même) fonction. Existe-t-il une option favorable pour faire cela ?

Remarque : Je n'ai pas besoin de deux fonctions différentes pour le faire, et le délai ne doit pas affecter l'exécution d'autres fonctions.

eg :

line 1: [executing first operation];

line 2: Delay                        /* I need to introduce delay here */

line 3: [executing second operation];

Toute aide est la bienvenue. Merci d'avance...

239voto

Paul.s Points 23073

Vous pouvez utiliser gcd pour effectuer cette opération sans avoir à créer une autre méthode

// ObjC

NSTimeInterval delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
  NSLog(@"Do some work");
});

// Swift

DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
    print("Do some work)
}

Vous devez toujours vous demander s'il est vraiment nécessaire d'ajouter un délai, car cela peut souvent compliquer le code et provoquer des conditions de course.

29voto

Ashley Mills Points 10205

Vous pouvez utiliser le NSThread méthode :

[NSThread sleepForTimeInterval: delay];

Cependant, si vous faites cela sur le fil principal, vous bloquerez l'application, donc ne faites cela que sur un fil d'arrière-plan.


ou en Swift

NSThread.sleepForTimeInterval(delay)

en Swift 3

Thread.sleep(forTimeInterval: delay)

25voto

Sunkas Points 791

Cette ligne appelle le sélecteur secondMethod après 3 secondes :

[self performSelector:@selector(secondMethod) withObject:nil afterDelay:3.0 ];

Utilisez-le lors de votre deuxième opération avec le délai souhaité. Si vous avez beaucoup de code, placez-le dans sa propre méthode et appelez cette méthode avec performSelector: . Il ne bloque pas l'interface utilisateur comme sleep

Edita: Si vous ne voulez pas d'une deuxième méthode, vous pouvez ajouter une catégorie pour pouvoir utiliser des blocs avec performSelector :

@implementation NSObject (PerformBlockAfterDelay)

- (void)performBlock:(void (^)(void))block 
          afterDelay:(NSTimeInterval)delay
{
    block = [block copy];
    [self performSelector:@selector(fireBlockAfterDelay:) 
               withObject:block 
               afterDelay:delay];
}

- (void)fireBlockAfterDelay:(void (^)(void))block
{
    block();
}

@end

Ou peut-être même plus propre :

void RunBlockAfterDelay(NSTimeInterval delay, void (^block)(void))
{
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC*delay),
      dispatch_get_current_queue(), block);
}

8voto

David Reich Points 106

J'ai quelques jeux au tour par tour où j'ai besoin que l'IA fasse une pause avant de prendre son tour (et entre les étapes de son tour). Je suis sûr qu'il y a d'autres situations, plus utiles, où un délai est la meilleure solution. Dans Swift :

        let delay = 2.0 * Double(NSEC_PER_SEC) 
        let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay)) 
        dispatch_after(time, dispatch_get_main_queue()) { self.playerTapped(aiPlayView) }

Je suis revenu ici pour voir si les appels en Objective-C étaient différents (il faut que j'ajoute ceci à celui-là aussi).

7voto

auspicious99 Points 395

[vérifié le 27 novembre 2020 et confirmé comme étant toujours exact avec Xcode 12.1].

Le moyen le plus pratique de nos jours : Xcode fournit un extrait de code qui vous permet de saisir la valeur du délai et le code que vous souhaitez exécuter après le délai.

  1. cliquez sur l'icône + en haut à droite de Xcode.
  2. rechercher after
  3. Il ne renverra qu'un seul résultat de recherche, qui est l'extrait souhaité (voir la capture d'écran). Double-cliquez dessus et c'est parti.

screenshot illustrating how to get the snippet from within Xcode itself

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