Я занимаюсь анализом текста и сталкиваюсь с раздражающим эффектом производительности, который, похоже, не может найти, как оптимизировать. Я начинаю с текста из 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, поэтому, если есть что-то, что я могу сделать, оптимизируя мои поисковые запросы с диапазонами или каким-то образом помещая свои операции в фоновый поток, я был бы очень обязан.
Я знаю, что это не ответ, но мне любопытно, зачем вам нужны эти исправления. Если вы выделяете текстовые диапазоны, вы можете использовать новые методы 'NSAttributedString' iOS 6 в' UITextView', чтобы выделить данный диапазон. – jbrennan
Вы должны разместить это как ответ! Просто спасла мне тонну отладки и времени исследований. Полностью забыл, что UITextViews теперь используют NSAttributedStrings! От 100 LoC до 15. Также я могу использовать GCD без каких-либо икота. Ах, моя жизнь намного лучше. – rnystrom