0

J'essaie de surveiller un thread que je définis en cours d'exécution en arrière-plan. J'ai besoin d'être alerté quand l'exécution est terminée.Surveillance des threads d'arrière-plan

- (IBAction) btnGreaterTen_clicked :(id)sender{ 

    self.searchDistance = [NSNumber numberWithDouble : 10]; 

    CGRect frame = CGRectMake (120.0, 185.0, 80, 80); 

    activity = [[UIActivityIndicatorView alloc] initWithFrame: frame]; 
    activity.activityIndicatorViewStyle = UIActivityIndicatorViewStyleGray; 


    [navigationUpdateFromDetail.window addSubview: activity]; 


    [activity startAnimating]; 


    thread = [[NSThread alloc] init]; 
    [thread start]; 

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

if(thread.isFinished == YES){ 
    [activity stopAnimating]; 
} 
} 

Le code ci-dessus ce que j'ai après avoir essayé différentes configurations afin d'atteindre le résultat final. J'essaye d'animer le UIActivityIndicator pendant que j'utilise cette méthode "getSetDisplay" pour récupérer des informations sur le net.

La fonction est bonne, mais l'indicateur d'activité ne s'affichait pas. On m'a dit que j'avais besoin de lancer le processus sur un fil de fond et l'animation sur le fil principal. Mon problème maintenant est comment puis-je surveiller quand ce processus est fait pour arrêter l'indicateur d'activité. merci d'avance

Répondre

4

Vous devriez considérer le problème sous un angle différent: vous devriez laisser votre "thread principal" continuer à fonctionner, et laisser votre "thread secondaire" appeler un sélecteur sur le thread principal quand il est fait de travailler .

Pour ce faire, vous devez utiliser la méthode performSelectorOnMainThread et l'appeler de votre fil secondaire. Son prototype est - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait. Vous devriez mettre votre "finition" code dans une méthode, et puis faire quelque chose comme:

[self performSelectorOnMainThread:@selector(doneDoingWork) withObject:nil waitUntilDone:NO]; 
+0

J'ai essayé cette méthode, mais l'UIActivity de ce que je comprends doit tourner sur le thread principal, et le système d'exploitation le met sur ce fil. C'est pourquoi je cours ma méthode sur le fond. J'ai juste besoin de savoir comment le surveiller – Makinitez21

+4

Envisager de mettre quelque chose comme ça à la fin de votre méthode 'getSetDisplay': ' [activity performSelectorOnMainThread: @selector (stopAnimating) avecObject: nil waitUntilDone: NO] ' – Mike

+1

Votre fil = [ [NSThread alloc] init]; ne semble rien faire du tout. Vous générez un thread ici, puis un autre avec l'appel performSelectorInBackground. Les commentaires ci-dessus sont probablement la façon dont j'irais ... Ou vous pourriez utiliser NSNotifications pour un message entre l'op de fond et l'op de premier plan. – Hunter

1

Merci les gars. J'ai finalement eu une solution qui a fonctionné grâce à Mike et son commentaire ci-dessus. J'ai démarré l'indicateur d'activité avec "[activity startAnimating]" qui s'exécute sur le thread principal. Puis j'ai commencé ma méthode sur un thread d'arrière-plan avec le "performSelectorInBackground". Et à la fin de ma méthode "getSetDisplay", j'ai placé la déclaration suivante.

[activity performSelectorOnMainThread: @selector (stopAnimating) withObject:nil waitUntilDone:NO]; 

Ceci est juste une autre façon de dire [activité stopAnimating], qui fonctionne sur le thread principal.

Merci à tous ceux qui ont répondu.