2010-12-12 59 views
3

Quel est l'effet réel d'appeler performSelectorInBackground:... à partir d'une méthode qui s'exécute en arrière-plan? Je veux qu'il fonctionne de manière asynchroneappel performSelectorInBackground: à partir du thread d'arrière-plan

Par exemple:

- (void) _imageBufferWasUpdated{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    //do something here 

    if(shouldContinue){ 
     [self performSelectorInBackground:@selector(_loop) withObject:nil]; 
    } 
    [pool release]; 
} 

_imageBufferWasUpdated fonctionnera en arrière-plan et je veux appeler _loop méthode de manière asynchrone (en arrière-plan aussi si _imageBufferWasUpdated se terminera bientôt, probablement avant _loop fin) .

Est-ce correct?

Existe-t-il une manière plus efficace (et relativement simple) de faire cela en utilisant GCD? Je vous serais reconnaissant si vous pouviez donner un exemple sur la façon de fourche cela en utilisant GCD. Je pense que j'ai besoin d'au moins 3 threads, thread principal, fil d'arrière-plan pour exécuter _imageBufferWasUpdated et autre thread d'arrière-plan pour _loop. Ai-je raison?

Merci à l'avance Ignacio

+0

s'il vous plaît, aidez-moi! ;) processus dans le fil de fond est extrêmement lent et je ne sais pas si c'est la raison ... – nacho4d

Répondre

2

Ce que vous faites me semble bien. Cocoa utilise probablement un seul thread d'arrière-plan, donc cela ne devrait pas conduire à une création excessive de threads.

Si vous souhaitez plus de contrôle, vous pouvez utiliser NSOperation ou GCD. Les deux sont assez simples. Par exemple, GCD serait comme ceci

#import <dispatch/dispatch.h> 

... 

dispatch_async(dispatch_get_global_queue(0,0), ^{ 
    [self _loop]; 
}]; 
+0

Il ne peut pas utiliser un seul thread d'arrière-plan; Cela conduirait rapidement à des blocages. – bbum

+0

Je pense que ce n'est pas exactement ce que je veux car l'utilisation de dispatch_get_global_queue fera courir _loop dans le thread principal et cette boucle est très occupée avec d'autres choses. Ne serait-ce pas quelque chose comme performSelectorOnMainThread: ... plutôt que performSelectorOnBackgroundThread? – nacho4d

+0

La file d'attente globale par défaut ne s'exécute pas sur le thread principal. Vous demandez la file d'attente principale pour le faire. La file d'attente par défaut s'exécute sur les threads d'arrière-plan. –

1

fourches performSelectorInBackground votre sélecteur sur un fil d'arrière-plan. [documentation]

Je ne sais pas si j'ai raison, mais vous devriez tout faire en utilisant GCD ou ses classes de haut niveau (NSOperationQueue). La fourchette trop de threads d'arrière-plan peut entraîner une diminution des performances si le système est saturé avec trop de threads et n'a pas assez de ressources de calcul

GCD gère automatiquement le nombre de threads qui fonctionnent simultanément en fonction des ressources système disponibles.

+0

Merci Jeremy, je vais essayer GCD;) – nacho4d