Je suis après quelques conseils sur l'utilisation de NSOperation
et le dessin:NSOpération bloque la peinture de l'interface utilisateur?
J'ai un fil conducteur créer ma sous-classe NSOperation
, ce qui ajoute à un NSOperationQueue
.
Mon NSOperation
fait du gros traitement, il est prévu de boucler sa méthode main() pendant plusieurs minutes, en traitant constamment du travail, mais pour l'instant je n'ai qu'une boucle while() avec un sleep (1) à l'intérieur, qui est configuré pour se déplacer seulement 5 fois (pour tester).
Le thread principal (original) qui engendre ce NSOperation
est chargé de dessiner à une vue et mettre à jour l'interface utilisateur. Je souhaitais que le thread NSOperation utilise une notification pour indiquer au thread principal qu'il avait effectué une certaine quantité de traitement, au moment où cette notification est envoyée une fois chaque fois qu'elle passe par sa boucle while() (c'est-à-dire; une fois par seconde parce que c'est juste en train de dormir (1)). Le thread principal (la vue), s'inscrit pour recevoir ces notifications.
Les notifications parviennent immédiatement au thread principal et paraissent asynchrones. Il semble que les deux threads s'exécutent comme prévu ... c'est-à-dire simultanément. (J'utilise NSLog() juste pour vérifier approximativement quand chaque thread envoie et reçoit la notification). Lorsque la vue reçoit une notification et que sa méthode gestionnaire est appelée, j'incrémente simplement une variable entière et j'essaie de la dessiner dans la vue (en tant que chaîne bien sûr). Lors du test, le code de drawRect: dessine cet entier (en tant que chaîne de caractères) sur l'écran.
Cependant: voici mon problème (désolé, il faut un peu de temps pour arriver ici): quand le thread principal (vue) reçoit une notification de NSOperation, il met à jour cet entier de test et appelle [self setNeedsDisplay]. Cependant, la vue ne se redessine pas tant que NSOperation n'est pas terminée! Je m'attendais à ce que NSOperation, étant un thread séparé, n'aurait aucune possibilité de bloquer la boucle d'événement du thread principal, mais il semble que c'est ce qui se passe. Lorsque NSOperation se termine et que son main() revient, la vue se redessine immédiatement. Peut-être que je n'utilise pas correctement NSOperation
. Je l'utilise en mode "non simultané", mais malgré le nom, je comprends que cela produit encore un nouveau thread et permet un traitement asynchrone.
Toute aide ou conseil très apprécié, si vous souhaitez voir du code, faites le moi savoir.
Vous pouvez le faire (performSelectorOnMainThread: withObject: waitUntilDone :) directement à partir de votre méthode principale NSOperation si vous voulez - sans toutes ces choses de notification. – grzaks