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];
}
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) –
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
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. –