2009-08-27 9 views
1

je dois faire une boucle et entre chaque boucle attendre 2 secondes et continuertemps de sommeil en boucle

for (int i = 0; i < [stories count]; i++) { 
    //my code 
    //sleep 2 seconds and continue 
} 

Comment puis-je faire cela?

Répondre

8
[NSThread sleepForTimeInterval:2.0]; 
1

Le problème est qu'il bloque l'interface utilisateur 2 * [stories count] secondes, certainement assez longtemps pour que l'utilisateur de noter que votre application ne répond pas et semble être suspendu. C'est mauvais.

Utilisez à la place une minuterie et conservez l'index (si vous en avez vraiment besoin) ou un NSEnumerator ([stores objectEnumerator]) dans le userInfo du minuteur. Implémentez votre méthode de rappel timer pour travailler sur exactement un objet. Si vous utilisez des index, cette méthode doit également remplacer l'index dans userInfo avec le suivant. Sa dernière étape sera de vérifier si vous n'avez plus d'éléments, et si c'est le cas, d'appeler la méthode où vous invalidez et relâchez la minuterie (que vous devez également appeler dealloc).

D'ailleurs, je demande pourquoi vous devez attendre deux secondes entre les opérations. Si vous attendez que quelque chose se produise, vous devriez en fait attendre, et attendre plus longtemps si nécessaire, au lieu de coder en dur un intervalle fixe de deux secondes entre les opérations.

2

Peter Hosey a raison de bloquer le thread UI, souvent appelé thread principal. Mais je pense que sa solution est alambiquée.

solution simple 1: Appelez la méthode où la longue boucle de blocage est sur un thread d'arrière-plan à l'aide:

[self performSelectorInBackground:@selector(longRunningMethod) 
         withObject:nil]; 

solution simple 2: Ajoutez la méthode où la longue boucle de blocage est à un NSOperationsQueue:

NSOperationQueue* oq = [[NSOperationQueue new] autorelease]; 
NSOperation* o = [[NSInvocationOperation alloc] initWithTarget:self 
                 selector:@selector(longRunningMethod) 
                 object:nil] 
[oq addOperation:o]; 
[o release]; 

Le déclenchement des sélecteurs en arrière-plan est plus facile, presque trop facile car ils peuvent drainer des ressources s'ils sont utilisés de manière extravagante. L'utilisation de NSOperationQueue nécessite quelques lignes de configuration, mais en tant que bonus, il réutilise les threads et applique d'autres optimisations pour utiliser moins de ressources. Comme son nom l'indique, il peut également être utilisé pour mettre en file d'attente des opérations. Vous pouvez spécifier le nombre maximal d'opérations parallèles et différentes contraintes.