2010-08-11 7 views
2

Je travaille actuellement sur un projet où je demande et analyse plusieurs sites html dans un contrôleur. Pour donner un certain retour à l'utilisateur, j'ai créé une deuxième vue, qui s'affiche pendant le traitement des données. Il affiche une étiquette d'état et une barre de progression. Dans mon contrôleur, j'ai plusieurs points où je mets à jour le texte de mes étiquettes. Malheureusement, cela ne fonctionne que parfois. Je suppose que c'est parce que l'étiquette n'est redessinée qu'une fois de temps en temps et j'essaie de le faire probablement plus souvent qu'une fois par seconde.Comment mettre à jour un UILabel fréquemment?

Cela ne fonctionne pas pour forcer un redessin avec [label setNeedsDisplay];

J'ai aussi fait un fil qui met à jour le texte des étiquettes avec le texte d'une variable globale et appelle également setNeedsDisplay sur l'étiquette à chaque seconde. Mais les résultats sont les mêmes. Je ne vois que certains changements, mais pas tous.

Tout est configuré correctement et l'étiquette n'est jamais nulle. Quand je connecte mon updateMethod, tout semble bien aller. Il ne s'affiche tout simplement pas!

Vive

Voici le code de mes fils

- (void)startUpdateStatusThread{ 

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
[self performSelectorOnMainThread:@selector(updateFrequently) withObject:nil waitUntilDone:NO]; 
[pool release]; 
} 



- (void)updateFrequently{ 
NSLog(@"updateFrequently: %@", currentStatus); 
test++; 
[self.statusLabel setText:[NSString stringWithFormat:@"%@ - %i", currentStatus, test]]; 
[self.statusLabel setNeedsDisplay]; 
[NSTimer scheduledTimerWithTimeInterval:0.0001 target:self selector:@selector(updateFrequently) userInfo:nil repeats:NO]; 
} 
+1

S'il vous plaît allez dans votre profil http://stackoverflow.com/users/345144/jagse et accepter les réponses aux questions précédentes. Cela donne un crédit où le crédit est dû pour les personnes qui vous aident. – iwasrobbed

+0

Savez-vous combien vous chargez le cpu du téléphone? Si vous l'optimisez, il n'aura peut-être jamais le temps de redessiner. Aussi, vous pouvez vouloir garder cela à l'esprit: http://blogs.msdn.com/b/oldnewthing/archive/2010/05/25/10014185.aspx#10014738 – Douglas

Répondre

2

Vous mentionnez les discussions. Sachez que les contrôles UIKit, tels que UILabel, ne peuvent être mis à jour qu'à partir du thread principal. Assurez-vous que vous essayez uniquement de définir le texte de l'étiquette à partir du thread principal, puis vérifiez si vous rencontrez toujours des problèmes.

EDIT en raison de modifier la question:

D'abord, -setNeedsDisplay dit que la vue dont il a besoin pour réafficher la prochaine fois que l'écran est actualisé, il ne force pas un écran à ce moment-là. Deuxièmement, l'écran de l'iPhone dessine à environ 60 hz. Cela signifie qu'il y a une mise à jour toutes les 0.016666 secondes. Vous essayez de mettre à jour beaucoup plus rapidement que cela, donc seulement environ toutes les 160e de vos mises à jour seront réellement affichées. Troisièmement, et probablement le plus important, vous ne semblez faire aucun thread, sauf si vous appelez -startUpdateStatusThread à partir d'un thread d'arrière-plan. D'une manière ou d'une autre, une fois que vous avez tapé -update, tout est de retour sur le thread principal. Avec la fréquence que vous planifiez cette minuterie, vous surchargez probablement le processeur et faites en sorte que le système n'ait pas le temps de dessiner l'étiquette. Ainsi, même si vous définissez un nouveau texte, vous ne lui donnez pas une chance de rendre. Vous devez réduire la fréquence de cette minuterie, et vous devez probablement repenser tout ce que vous essayez de faire.

+0

Voir la modification dans la question ci-dessus – jagse

3

Ai-je raison de supposer que vous appelez la propriété text de votre libellé ainsi que setNeedsDisplay dans votre "Thread" qui analyse vos sites Web?

Notez que: les modifications apportées à UIViews (ou sous-classes de UIView comme votre étiquette) doivent être effectuées sur le thread principal.

Ce que je vous recommande de faire est d'écrire une méthode d'assistance qui met à jour votre étiquette et appelle setNeedDisplay, l'appel à partir de votre Parser-fil

[mainViewController performSelectorOnMainThread:@selector(yourUpdateLabelHelper:) withObject:nil waitUntilDone:NO]; 

qui devrait faire votre travail.

+0

Voir la modification dans la question ci-dessus – jagse

1

Je pense que la création de la minuterie doit être dans une fonction séparée: Autoriser la répétition et également stocker le minuteur dans une variable membre, vous pouvez fermer sur dealloc. [NSTimer scheduledTimerWithTimeInterval: 0,0001 cible: self selector: @selector (updateFrequently) userInfo: nil répète: YES]; }

La fonction de mise à jour doit fonctionner comme une fonction de rappel.

Cordialement Assayag

Questions connexes