2010-09-01 3 views
2

Ceci est ma première question ici, alors excusez-moi si j'ai fait des erreurs!Appelez la méthode d'un délégué dans un contexte

Dans mon projet iPhone, j'ai une méthode en cours d'exécution dans un thread qui prend beaucoup de temps à s'exécuter (c'est pourquoi il s'exécute dans un thread).

[NSThread detachNewThreadSelector:@selector(methodToBeCalledInAThread) toTarget:self withObject:nil]; 

// ... 

-(void)methodToBeCalledInAThread { 
    MyClass *myClass = [[MyClass alloc] init]; 
    [myClass setDelegate:self]; 
    [myClass veryIntensiveComputing]; 
    [myClass release]; 
} 

Mon but est de l'ViewController avertissons appelant cette méthode de tout progrès en cours dans cette méthode. C'est pourquoi j'ai défini le ViewController en tant que délégué de la classe.

Maintenant, dans la méthode coûteuse je fais ce qui suit:

if(self.delegate != nil) { 
    [self.delegate madeSomeProgress]; 
} 

Mais malheureusement, cela ne fonctionne pas, parce que (je pense) Je suis dans un thread d'arrière-plan.

Comment puis-je notifier le délégué de tout changement avec la méthode en cours d'exécution asynchrone?

Répondre

4

Essayez [self.delegate performSelectorOnMainThread: @selector(madeSomeProgress) withObject: nil waitUntilDone: YES]; ....

Voir la documentation for details.

Ceci exécutera l'opération sur le thread principal. Tant que rien dans le thread principal essaie d'exécuter des choses dans ce thread secondaire, c'est la plupart du temps sûr à faire.

Cependant Si vous ne voulez pas bloquer le calcul jusqu'à ce que le thread principal traite la demande, vous pouvez passer NO pour ne pas attendre. Si vous le faites, vous devez également vous soucier de la synchronisation des threads. Il se peut que le thread principal ne réponde pas immédiatement à la requête et, le cas échéant, votre thread d'arrière-plan soit en cours de mutation.

Les fils sont durs.

+0

En effet, ils sont. ;) La méthode performSelectorOnMainThread m'est venue à l'esprit il y a quelques minutes. J'ai fini par ajouter une autre méthode dans la classe background-thread, appelée par "performSelectorOnMainThread". Cette méthode appelle donc la méthode du délégué sur le thread principal et tout fonctionne correctement. Je vous remercie! –

Questions connexes