2009-06-29 6 views
3

Je me demandais si quelqu'un connaît une classe dans l'objectif-C qui arrête/retarde l'application à un moment donné pendant l'exécution? J'ai déjà regardé le gestionnaire de temps et NSTimer et ne vois pas comment je pourrais mettre un retard là dedans. Je n'ai jamais utilisé ces deux cours auparavant, alors peut-être que quelqu'un d'autre a et pourrait me donner un pourboire? Merci!Retard de temps de classe Objective-C?

+0

Pourquoi voulez-vous que votre application se bloque pendant un certain temps? Ou voulez-vous retarder quelque chose de moins que l'application entière, l'interface utilisateur et tout? – user57368

+0

Je veux juste que le runloop sur lequel fonctionne mon application soit retardé de quelques secondes. Le problème est que mon application est accrochée quelque part dans la boucle et j'utilise une étiquette dans mon GUI et labelStatus.text = @ "someText" afin que je puisse identifier où le blocage est. –

+0

Je suppose que cela veut dire que je veux que mon application entière se bloque pendant quelques secondes, de cette façon, aucun thread d'arrière-plan dans le runloop n'est encore en cours d'exécution, parce que c'est probablement ce qui cause le problème. –

Répondre

4

Cela dépend vraiment de ce que vous entendez par "arrête/retarde l'application". Si vous avez une seule application filaire, vous pouvez utiliser n'importe lequel des différents appels de sommeil (sommeil, sommeil, nanosleep, etc.). Ce n'est probablement pas ce que vous voulez cependant, car cela entraînera une interface utilisateur bloquée pour l'utilisateur, et n'arrêtera pas les threads d'arrière-plan.

Pour réellement donner une réponse décente, il est probablement nécessaire de savoir ce que vous essayez réellement de faire. Attendez-vous quelque chose, interroger une ressource, etc?

+0

bien en fait, mon application fonctionne sur un runloop et il se bloque à un certain point (que je ne sais pas où pour le moment). J'ai placé une étiquette dans mon interface graphique juste pour que je puisse mettre un délai dans la boucle de mon application juste après un label.text = "Application Running Until Here". Je pensais que ce serait le moyen le plus efficace de voir exactement où mon application est accrochée. –

+0

Vous voulez dire un UILabel? Je ne pense pas que cela fera ce que vous voulez. Tout le dessin d'écran est différé jusqu'à l'exécution de la boucle de lancement, donc "label.text = @" Application Running ici "; sleep (3);" s'arrêtera pendant 3 secondes après avoir défini la valeur du texte des étiquettes, mais avant la mise à jour de l'écran. Si votre piste se bloque pour une autre raison après cela, l'étiquette ne sera jamais mise à jour à l'écran, même si vous avez défini la valeur du texte. Si vous voulez des horodatages réels, utilisez l'une des applications de débogage ou NSLog pour la console. –

+0

Eh bien, je suis d'accord avec vous sur le débogage NSLog. Comment feriez-vous exactement cela si vous exécutez une application (je sais, mettez juste NSLog @ "someText") que j'ai essayé de l'implémenter auparavant dans mon application et quand je l'exécute sur le simulateur, rien ne se montre dans le Terminal. Aussi, le problème que je vais probablement rencontrer est que j'ai implémenté un runloop similaire à celui de GKTank qui utilise les capacités de connectivité bluetooth P2P de l'iPod Touch/iPhone et le simulateur ne supporte actuellement pas cela. Alors, de quelle façon me suggérez-vous d'attaquer ce problème? –

2

Je pense que vous cherchez [NSThread sleepForTimeInterval:] Cela devrait faire l'affaire. Vous devriez également envisager d'utiliser une minuterie pour invoquer une autre fonction après un délai, car cette solution n'est pas bloquante. L'approche NSThread verrouillera totalement votre application pour l'intervalle de temps si vous l'appelez depuis le thread principal.

+1

Il va verrouiller l'interface utilisateur, il ne verrouillera pas les threads d'arrière-plan qui peuvent faire des choses, y compris les threads de cadre comme le chargeur http. –

4
#include <unistd.h> 
sleep(3); // or usleep(3000000);