2010-04-11 6 views
2

J'ai un NSTextView sous-classé que je manipule dans un fil séparé (using performSelectorOnMainThread: withObject: waitUntilDone :) en utilisant des sélecteurs replaceCharactersInRange: withString :, setSelectedRange :, et insertText :. Je suis confronté à un scintillement de texte et à de mauvaises performances car NSTextView met à jour l'affichage pour chaque opération.contrôle des mises à jour NSTextView pour gérer le scintillement et améliorer la vitesse

Des suggestions sur la façon de contrôler quand l'affichage est mis à jour, afin que je puisse le mettre à jour seulement quand réellement nécessaire? J'ai essayé d'utiliser diverses combinaisons setNeedsDisplay: NO (à la fois les threads principaux et d'arrière-plan, avant et après mes mises à jour) qui semble être ignoré.

Merci d'avance à tous ceux qui peuvent donner un aperçu.

Répondre

3

Je pense que vous devriez manipuler le NSTextStorage sous-jacent pour la vue texte, plutôt que d'invoquer directement les méthodes liées aux événements de la vue. Ceci est un exemple assez classique d'une architecture Model-View-Controller: le NSTextView est la vue et le NSTextStorage est le modèle. Dans la mesure du possible, vous souhaitez manipuler directement le modèle et laisser les couches contrôleur/vue gérer la mise à jour de la vue comme bon leur semble.

+0

Oui. Le système de texte Cocoa est hautement optimisé et vous obtiendrez de bonnes performances si vous l'utilisez comme il est censé être utilisé. Dans ce cas, modifiez l'objet 'NSTextStorage' sous-jacent, qui est juste une sous-classe de' NSAttributedString' plutôt que de modifier la vue, qui est une approche de masse. –

+0

Merci! Une combinaison de l'utilisation de l'objet NSTextStorage en plus d'une certaine optimisation de la façon dont je modifiais le texte a fait l'affaire. – stdout