2010-11-13 3 views
0

J'ai écrit un exemple de code dans une application séparée, qui met en file d'attente les éléments dans un NSMutableArray. J'ai alors une méthode qui boucle à travers ce tableau et crée un NSInvocationOperation, le met dans la NSOperationQueue, libère l'opération et ainsi de suite. La méthode est ensuite appelée (affiche simplement la chaîne qui a été stockée dans le tableau et transmise à l'opération), fait son travail et renvoie un NSNotification à ViewController. La méthode de l'observateur est atteinte, mais les opérations sont retardées. Par exemple, la méthode de l'observateur met simplement à jour un UILabel avec le nombre de messages qui restent dans la file d'attente. Il le fait éventuellement, mais il semble y avoir un décalage de cinq secondes entre toutes les opérations des SNO et l'actualisation de l'interface utilisateur. Pour moi, il semble que NSOperationQueue bloque le thread principal. Y at-il de toute façon que l'interface utilisateur réponde immédiatement aux notifications?NSOperationQueue décalage sur IOS4

Une note importante est que je n'ai pas encore testé cela sur le téléphone, juste le simulateur. Je ne suis pas sûr que cela fasse une différence.

Désolé d'avance. Je suis loin de mon ordinateur et je n'ai pas le code devant moi. J'espère que je l'ai bien expliqué. J'ai aussi lu la documentation, je n'ai rien trouvé qui réponde vraiment à cette question spécifique pour moi.

+0

Cela peut ne pas être significatif, mais sur quel sujet publiez-vous des notifications? Par défaut, les notifications publiées avec le centre de notification par défaut sont reçues sur le fil sur lequel elles sont publiées. – warrenm

+0

Eh bien, cela pourrait avoir un sens parce que le ViewController reçoit les notifications, donc je suppose que NSOperationQueue s'exécute sur le même thread car il affiche les notifications. – iosnewbie

+0

Ainsi, par exemple, - (void) messagePosted: (NSNotification *) note {lblMessage.text = "Hi";} est touché, mais le texte de lblMessage ne changera pas en "Hi" pendant plusieurs secondes après les opérations sur la file d'attente A été complété. – iosnewbie

Répondre

1

Le délai est typique des mises à jour de l'interface utilisateur effectuées sur des unités d'exécution autres que le serveur principal.

Pour voir votre mise à jour instantanément sur la UILabel, assurez-vous d'invoquer Quelque soit la méthode mise à jour text de l'étiquette comme suit:

[self performSelectorOnMainThread:@(myMethodToUpdateLabelWithText:) withObject:text waitUntilDone:NO]; 

myMethodToUpdateLabelWithText est une méthode au sein de votre classe qui définit la valeur de texte de l'étiquette.