управление обновлениями NSTextView для борьбы с мерцанием и повышения скорости

У меня есть подкласс NSTextView, которым я управляю в отдельном потоке (используя PerformSelectorOnMainThread:withObject:waitUntilDone:), используя селекторы replaceCharactersInRange:withString:, setSelectedRange: и insertText:. Я испытываю мерцание текста и низкую производительность, поскольку NSTextView обновляет отображение для каждой операции.

Любые предложения о том, как контролировать обновление дисплея, чтобы я мог обновлять его только тогда, когда это действительно необходимо? Я пытался использовать различные комбинации setNeedsDisplay:NO (как из основного, так и из фонового потока, до и после моих обновлений), которые, похоже, игнорируются.

Заранее спасибо всем, кто может дать некоторое представление.


person stdout    schedule 11.04.2010    source источник


Ответы (1)


Я думаю, вы должны манипулировать базовым NSTextStorage для текстового представления, а не напрямую вызывать методы представления, связанные с событиями. Это довольно классический пример архитектуры Model-View-Controller: NSTextView — это представление, а NSTextStorage — это модель. Когда это возможно, вы хотите манипулировать моделью напрямую и позволить слоям контроллера/представления обновлять представление по своему усмотрению.

person Barry Wark    schedule 11.04.2010
comment
Ага. Текстовая система Cocoa высоко оптимизирована, и вы определенно получите хорошую производительность, если будете использовать ее так, как она должна использоваться. В этом случае изменение базового объекта NSTextStorage, который является просто подклассом NSAttributedString, а не изменение представления, что является подходом кувалды. - person Rob Keniger; 12.04.2010
comment
Спасибо! Комбинация использования объекта NSTextStorage в дополнение к некоторой оптимизации того, как я модифицировал текст, сделала свое дело. - person stdout; 14.04.2010