Question

Y a-t-il un moyen plus simple d'attendre un temps spécifique à Cacoa que ce que j'ai trouvé ci-dessous?

- (void) buttonPressed {
    [self makeSomeChanges];

    // give the user some visual feedback and wait a bit so he can see it
    [self displayThoseChangesToTheUser];
    [self performSelector:@selector(buttonPressedPart2:) withObject:nil afterDelay:0.35];
}

- (void) buttonPressedPart2: (id)unused {
    [self automaticallyReturnToPreviousView];
}

Juste pour être clair, il n'y a pas fonctionnel problème avec ce code - mon seul bœuf est un stylistique une. Dans mon cas, le flux est assez simple pour que cela fonctionne, mais essayez de le résumer ou de jeter des conditions et les choses pourraient devenir laides. Cela m'a un peu harcelé que je n'ai pas pu trouver un moyen d'attendre puis de revenir à ce même point dans un code comme celui-ci (fictif) Exemple:

- (void) buttonPressed {
    [self doStuff];
    [UIMagicUnicorn waitForDuration:0.35];
    [self doStuffAfterWaiting];
}
Était-ce utile?

La solution

Il y a

usleep(1000000);

et

[NSThread sleepForTimeInterval:1.0f];

Les deux dorment pendant 1 seconde.

Autres conseils

Voici la façon nstimer de le faire. C'est peut-être encore plus laid que la méthode que vous utilisez, mais cela permet de répéter des événements, donc je le préfère.

[NSTimer scheduledTimerWithTimeInterval:0.5f 
                                 target:self
                               selector: @selector(doSomething:) 
                               userInfo:nil
                                repeats:NO];

Vous voulez éviter quelque chose comme Usle Sleep () qui accrochera votre application et le fera ne pas répondre.

Je ne sais pas si cela existe (encore), mais avec des blocs dans 10.6 (ou Plblocs en 10.5 et sur l'iPhone), il devrait être assez facile d'écrire un petit wrapper comme performBlock:afterDelay: Cela fait exactement ce que vous voulez sans avoir besoin de dormir tout le fil. Serait en effet un petit morceau de code utile.

Mike Ash a écrit sur une approche comme celle-ci sur son blog:

NSString *something = ...;
RunAfterDelay(0, ^{
    NSLog(@"%@", something);
    [self doWorkWithSomething: something];
});

Quel est le problème avec un simple usleep? Je veux dire, à l'exception de la "pureté de cacao", c'est encore beaucoup plus court que les autres solutions :)

Vous voulez probablement utiliser un Nstimer Et faites-le envoyer un message "dostuffafterwaiting" comme rappel. Tout type de «sommeil» bloquera le fil jusqu'à ce qu'il se réveille. Si c'est dans votre fil d'interface utilisateur, cela amènera votre application à apparaître "morte". Même si ce n'est pas le cas, c'est une mauvaise forme. L'approche de rappel libérera le CPU pour effectuer d'autres tâches jusqu'à ce que votre intervalle de temps spécifié soit atteint.

Cette doc A des exemples d'utilisation et discute des différences sur la façon et où créer votre minuterie.

Bien sûr, PerformSelector: Afterdelay: fait la même chose.

Et voilà!

Un peu plus informatif, le lien pointe vers NSThread sleepForTimeInterval:

Cela a en fait été volé: Quel est l'équivalent de Java's Thread.Sleep () dans Objective-C / Cocoa?

Si cela ne vous dérange pas une solution asynchrone, c'est parti: c'est parti:

[[NSOperationQueue currentQueue] addOperationWithBlock:^{
    [self doStuffAfterWaiting];
}];
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top