2009-10-27 3 views
1

J'ai un ensemble de tâches qui sont répétées et au lieu de créer un nouveau thread à chaque fois que cette tâche invoquée par l'utilisateur doit être effectuée, j'aimerais utiliser un pool de threads.Pools de threads dans CocoaTouch?

Dans le flux standard pour créer un nouveau thread, vous devez configurer un pool de libérations automatiques chaque fois que le point d'entrée de thread est appelé. Il semble que la performance pour cette opération peut être triviale selon http://www.mikeash.com/?page=pyblog/autorelease-is-fast.html mais ce que je veux faire est d'éviter les coûts associés à la mise en place et l'arrachage de beaucoup de ces threads pendant l'exécution de mon application. Dans d'autres frameworks/langages, je viens de récupérer un thread inactif et de le faire faire le travail. Une fois le travail terminé, le thread est renvoyé dans le pool.

Je ne vois aucun objet de pool de threads dans le SDK iPhone juste NSThread. Quel est un bon moyen de le faire?

Comment j'installer mon fils:

// create thread using supplied entry point 
[NSThread detachNewThreadSelector:@selector(myMethod) 
     toTarget:self 
     withObject:nil]; 

// thread entry-point 
- (void)myMethod { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    *** code that should be run in the new thread goes here *** 

    [pool release]; 
} 

Répondre

4

La façon dont vous voulez aller à ce sujet est d'utiliser un NSOperationQueue, qui tiendra une file d'attente des tâches à accomplir et exécute le plus grand nombre en parallèle comme vous le souhaitez (configurable), chacun sur un fil d'arrière-plan. Je suppose que l'implémentation réutilise les threads après une opération donnée est terminée. Vous utilisez NSOperationQueue en conjonction avec NSOperations - vous pouvez avoir des appels synchrones dedans (puisque le travail est tout fait sur un thread d'arrière-plan) ou vous pouvez toujours faire des appels asynchrones avec un peu plus de travail (il faut en définir quelques-uns) plus de méthodes). Il s'agit d'un tutorial que vous pouvez trouver utile.

+0

Si l'application est interrompue (l'utilisateur se déconnecte, la vue est ignorée, etc.) alors qu'il y a des opérations dans la file d'attente, sont-elles complétées immédiatement ou après le pp est réactivé? (en supposant que NSOperationQueue n'est pas libéré pendant la durée de vie de l'application) –

+0

Tout ce qui a été exécuté au moment du changement est tout ce qui sera exécuté. Les éléments enchâssés ne sont ni exécutés en arrière-plan ni conservés pour le prochain lancement. – bbum

+0

Toutefois, si vous souhaitez vous assurer que toutes les opérations s'exécutent avant la fin de votre application, vous pouvez utiliser la méthode -waitUntilAllOperationsAreFinished de NSOperationQueue dans votre méthode applicationWillTerminate: delegate. Assurez-vous simplement que vous ne prenez pas trop de temps dans ces opérations ou votre demande sera forcée de quitter de toute façon. –

0

Je recommanderais d'utiliser NSOperationQueue pour ce que vous voulez. Vous pouvez définir le nombre de threads de la file d'attente.

0

Je pense que les autres réponses sont sur place avec NSOperationQueue, mais par souci d'exhaustivité, vous devriez être au courant de ces projets:

  • PLBlocks (support du compilateur + runtime pour les blocs sur iPhone)
  • WiganWallgate (implémentation de la distribution centrale sur iPhone)
Questions connexes