Quel est l'équivalent de Thread.sleep () de Java dans Objective-C / Cocoa?

112

En Java, vous pouvez suspendre l'exécution du thread en cours pendant un certain temps en utilisant Thread.sleep(). Y a-t-il quelque chose comme ça dans Objective-C?

levi
la source

Réponses:

160

Oui, il y a + [NSThread sleepForTimeInterval:]

(Juste pour que vous sachiez pour les questions futures, Objective-C est le langage lui-même; la bibliothèque d'objets (l'un d'entre eux au moins) est Cocoa.)

smorgan
la source
6
Thnx! <br> pour référence future, la définition est en fait + [NSThread sleepForTimeInterval:] (donc, utilisé comme [NSThread sleepForTimeInterval: 0.1]).
TinkerTank
C'est parfait. Merci! Je viens de terminer mes blocs d'animation et cela a fonctionné comme un charme.
RileyE
que diriez-vous de dormir sur le thermostat principal?
jerinho.com
1
C'est le même; le fil principal n'est qu'un fil. Cependant, dormir sur le thread principal est généralement une mauvaise idée, car cela rend votre programme non réactif.
smorgan
4
pour ceux qui se demandent, [NSThread sleepForTimeInteval:] est le même que [[NSThread currentThread] sleepForTimeInterval:].
pnizzle
94

Dormir une seconde en Java:

Thread.sleep(1000);

Dormir pendant une seconde en Objectif C:

[NSThread sleepForTimeInterval:1.0f];
Rok Strniša
la source
40

Pourquoi dormez-vous? Lorsque vous dormez, vous bloquez l'interface utilisateur et le chargement de toute URL d'arrière-plan pas dans d'autres threads (l'utilisation des méthodes asynchrones NSURL fonctionne toujours sur le thread actuel).

Il y a de fortes chances que vous souhaitiez vraiment performSelector: withObject: AfterDelay. C'est une méthode sur NSObject que vous pouvez utiliser pour appeler une méthode à un intervalle prédéterminé plus tard - elle planifie un appel qui sera effectué ultérieurement, mais tous les autres éléments que le thread gère (comme l'interface utilisateur et les charges de données) continuer encore.

Kendall Helmstetter Gelner
la source
43
Le sommeil m'est utile à des fins de test. Je peux simuler certains retards du réseau pour m'assurer que mon application répond correctement. Actuellement, je teste sur un serveur Web local, donc tout est essentiellement instantané.
brantonb
6
Le sommeil n'est pas la bonne façon de tester les retards du réseau. Regardez la réponse à cette question stackoverflow.com/questions/1502060/… pour voir comment tester des vitesses variables de réseaux dans le simulateur. Parce que dormir le thread principal bloque tout, vous ne simulez pas du tout un retard réseau, mais plutôt une suspension de l'application.
Kendall Helmstetter Gelner
La mise en veille est utile pour simuler ce qui est fait lors d'une opération de jointure sur un thread JAVA. Vous dormez pendant 10 millis, vérifiez si le thread est mort, vous pouvez le désallouer.
Mike S
1
Si vous dormez pendant une période de temps, votre fil sera exactement dans le même état qu'il était avant de dormir. Ce n'est pas un bon test car dans le monde réel, votre application sera en cours de traitement, pas en veille. C'est pourquoi il est important de savoir comment tester sans compter sur le sommeil.
Kendall Helmstetter Gelner
+1 Merci d'avoir indiqué une solution alternative! Juste ce que je cherchais :)
jpswain
7

Bien sûr, vous pouvez également utiliser les appels standard Unix sleep () et usleep (). (Si vous écrivez Cocoa, je resterais avec le [NSThread sleepForTimeInterval:], cependant.)

Bill Heyman
la source
5

Si vous utilisez NSThread sleepForTimeInterval (code commenté) pour dormir, la récupération des données sera bloquée, mais + [NSThread sleepForTimeInterval:] (méthode checkLoad) ne bloquera pas la récupération des données.

Mon exemple de code comme ci-dessous:

- (void)viewDidAppear:(BOOL)animated
{
//....
//show loader view
[HUD showUIBlockingIndicatorWithText:@"Fetching JSON data"];
//    while (_loans == nil || _loans.count == 0)
//    {
//        [NSThread sleepForTimeInterval:1.0f];
//        [self reloadLoansFormApi];
//        NSLog(@"sleep ");
//    }
[self performSelector:@selector(checkLoad) withObject:self afterDelay:1.0f];
}

-(void) checkLoad
{
    [self reloadLoansFormApi];
    if (_loans == nil || _loans.count == 0)
    {
        [self performSelector:@selector(checkLoad) withObject:self afterDelay:1.0f];
    } else
    {
        NSLog(@"size %d", _loans.count);
        [self.tableView reloadData];
        //hide the loader view
        [HUD hideUIBlockingIndicator];
    }
}
wu liang
la source
0

usleep () peut également être utilisé comme ive utilisé pour mettre en pause le thread actuel à certains moments

j2emanue
la source