2011-03-25 2 views
0

Lorsque mon application démarre pour la première fois, j'ai un processus d'arrière-plan qui se déroule à partir d'un thread et l'utilisateur devrait voir une progression qui devrait montrer les progrès réalisés. Le code ci-dessous montre comment je suis en train de mon fils et progressViewma progression n'est pas rafraîchissante

//from viewDidLoad 
progView.hidden = NO; 
progView.progress = 0.0; 
[NSThread detachNewThreadSelector:@selector(buildTable) toTarget:self withObject:nil]; 

-(void)buildTable 
{ 
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
[self performSelectorOnMainThread:@selector(addData) withObject:nil waitUntilDone:NO]; 
[pool release]; 
} 

la fonction addData est où mettre à jour le progressView en utilisant le code suivant -

progView.progress = 0.1 

Cependant, le progressView est visible, mais même si le processus d'arrière-plan met à jour la vue de progression en utilisant le code ci-dessus, il n'apparaît pas ainsi sur l'écran. Dois-je utiliser une forme de StartAnimating pendant que le processus d'arrière-plan est en cours d'exécution?

Répondre

1

Vous devez uniquement mettre à jour les éléments de l'interface utilisateur du thread principal. Vous ne voyez probablement aucun changement dans l'indicateur de progression car vous essayez de le modifier à partir d'un fil d'arrière-plan.

Une stratégie très simple pour ce faire est d'appeler performSelectorOnMainThread à partir de votre thread d'arrière-plan pour appeler une méthode simple qui met à jour la barre de progression sur le thread principal.

Par exemple, dans votre méthode addData (dans le thread d'arrière-plan), vous pouvez appeler:

[self performSelectorOnMainThread:@selector(updateProgressBar:) withObject:[NSNumber numberWithFloat:newProgressValue] waitUntilDone:false]; 

Et puis dans votre méthode updateProgressBar (qui se déroulera sur le thread principal), faire la mise à jour de la barre de progression en utilisant les données données:

- (void)updateProgressBar:(NSNumber *)progressValue { 
    progView.progress = [progressValue floatValue]; 
} 
Questions connexes