2

Я занимаюсь анализом текста и сталкиваюсь с раздражающим эффектом производительности, который, похоже, не может найти, как оптимизировать. Я начинаю с текста из UITextView и разбиваю текст на массив предложений, разделяя символы на «.?!».Построение CGPath вокруг предложений в UITextView невероятно медленное в -positionFromPosition:

Затем я перебираю каждое предложение, разбивая предложение на массив слов и вытягивая первое и последнее слово из предложения. С NSRange текста предложения в руке, я нахожу диапазон первого и последнего слова в тексте UITextView.

Следующая часть, где я получаю гвоздь с производительностью стоков. Это, как я считаю, ограничивающую CGRect первого и последнего слова:

// the from range is increased each iteration 
// so i'm not searching the entirety of the text each pass 
NSRange range = [textView.text rangeOfString:firstWord options:kNilOptions range:fromRange]; 

UITextPosition *beginning = textView.beginningOfDocument; 
UITextPosition *start = [textView positionFromPosition:beginning offset:range.location]; 
UITextPosition *end = [textView positionFromPosition:start offset:range.length]; 
UITextRange *textRange = [textView textRangeFromPosition:start toPosition:end]; 

firstRect = [textView firstRectForRange:textRange]; 

выполнить это дважды один раз для первого слова и один раз для последнего слова.

Это хорошо работает на меньшем тексте, но приближается к 5 пунктам. Инструменты говорят мне, что операция UITextView -positionFromPosition: ест 492 мс часов, блокируя UI и CPU на 100%.

Мне нужен CGRect, окружающий первое и последнее слова, поэтому я могу построить CGPath, чтобы выделить предложение. Все работает и выглядит очень здорово, но его повесить, пока найдены прямые, которые меня убивают. Я довольно новичок в использовании UITextView, поэтому, если есть что-то, что я могу сделать, оптимизируя мои поисковые запросы с диапазонами или каким-то образом помещая свои операции в фоновый поток, я был бы очень обязан.

+1

Я знаю, что это не ответ, но мне любопытно, зачем вам нужны эти исправления. Если вы выделяете текстовые диапазоны, вы можете использовать новые методы 'NSAttributedString' iOS 6 в' UITextView', чтобы выделить данный диапазон. – jbrennan

+0

Вы должны разместить это как ответ! Просто спасла мне тонну отладки и времени исследований. Полностью забыл, что UITextViews теперь используют NSAttributedStrings! От 100 LoC до 15. Также я могу использовать GCD без каких-либо икота. Ах, моя жизнь намного лучше. – rnystrom

ответ

1

Вам будет выгодно использовать UITextViewattributedText, которое принимает NSAttributedString. При этом вы можете установить NSBackgroundColorAttributeName на цвет в определенном диапазоне.

Просто обратите внимание, что приписанные текстовые методы работают только в iOS 6+.

+0

Программная модификация UITextView.text для добавления атрибутов в текст отключает встроенный UNDO для этого текстового представления. – Kibernetik