Comment attendre en Objective-C

Je veux changer le UILabel mon UILabel après 2 secondes.

J'ai essayé de régler le UILabel mon UILabel sur "Un text" , et j'utilise sleep(2) pour enfin changer le text en "Another text" .

Mais sleep(2) ne fait que geler l'application et "Another text" est défini sans afficher "A text" pendant 2 secondes.

Comment puis-je afficher "Un text" pendant 2 secondes, puis afficher "Un autre text" ?

Vous pouvez utiliser

 [self performSelector:@selector(changeText:) withObject:text afterDelay:2.0]; 

ou si vous voulez l'afficher périodiquement, vérifiez la class NSTimer .

Je sais que je suis en retard à cette fête. Mais j'ai trouvé que les gens n'ont pas mentionné le sumil du fil. Si vous utilisez GCD pour appeler cette fonction. Vous pouvez utiliser :

 [NSThread sleepForTimeInterval:2.0f]; 

pour retarder le fil pendant 2 secondes.

 [self changeText: @"A text"]; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ //Here your non-main thread. [NSThread sleepForTimeInterval:2.0f]; dispatch_async(dispatch_get_main_queue(), ^{ //Here you returns to main thread. [self changeText: @"Another text"]; }); }); 

Edit 2 (février 2015):

Je pense que le NSTimer est une excellente solution. Ma solution juste donner une autre option pour atteindre l'objective de NSTimer.

Veuillez lire: Comment utiliser NSTimer?

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

Dans la class, vous avez besoin de cette méthode:

 - (void) doSomethingWhenTimeIsUp:(NSTimer*)t { // YES! Do something here!! } 

Edit 3 (mai 2016):

Dans Swift 2.0, vous pouvez utiliser cette méthode:

  NSTimer.scheduledTimerWithTimeInterval(2.0, target: self, selector: "doSomethingWhenTimeIsUp:", userInfo: nil, repeats: false) 

Il crée une entité NSTimer et ajoute automatiquement le temporisateur au NSRunLoop associé au NSThread dans lequel le temporisateur est créé.

Édition 4 (juin 2016):

Dans Swift 2.2, la façon d'invoquer select est:

 #selector(doSomethingWhenTimeIsUp(_:)) 

Donc, c'est quelque chose comme:

  NSTimer.scheduledTimerWithTimeInterval(2.0, target: self, selector: #selector(doSomethingWhenTimeIsUp()), userInfo: nil, repeats: false) 

Édition 5 (oct. 2016):

Dans Swift 3, le moyen d'invoquer select est:

 #selector(doSomethingWhenTimeIsUp) 

Donc, c'est quelque chose comme:

  Timer.scheduledTimer(timeInterval: 2.0, target: self, selector:#selector(doSomethingWhenTimeIsUp), userInfo: nil, repeats: false) 

Ensuite, la fonction devrait ressembler à ceci:

  @objc private func doSomethingWhenTimeIsUp(){ // Do something when time is up } 

Grand Central Dispatch dispose d'une fonction d'assistance dispatch_after() pour effectuer des opérations après un timeout qui peut être très utile. Vous pouvez spécifier la durée d'attente avant l'exécution et l'instance dispatch_queue_t à exécuter. Vous pouvez utiliser dispatch_get_main_queue() pour exécuter sur le thread principal (UI).

 double 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){ // do something }); 

Dans Swift 3 , l'exemple ci-dessus peut être écrit comme:

 DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { // do something } 

Vous pouvez utiliser NSTimer , comme ça –

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

Définissez une autre méthode updateLabel et effectuez la mise à jour ici. Définissez votre timeInterval pour répondre à vos besoins …

Le réglage des repeats sur YES permet également de s'assurer que ce sélecteur est exécuté toutes les 0,5 secondes (dans le cas ci-dessus).

Vous pouvez accomplir ceci avec une timer, par exemple

  NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:4.0 target:self selector:@selector(eventToFire:) userInfo:nil repeats:YES]; // Fire every 4 seconds. ... - (void)eventToFire:(NSTimer*)timer { // Do Something } 

C'est parce que la vue n'est pas mise à jour jusqu'à la fin du cycle. Au lieu d'utiliser sleep, essayez d'utiliser NSTimer pour définir une heure spécifique de mise à jour de la vue.

Vous devez utiliser une timer. Utiliser le sumil arrêtera tout votre programme. Vérifiez NSTimer