2

我正在做一些文本分析并且遇到了令人讨厌的性能提升,我似乎无法找到如何优化。我从 UITextView 中的文本开始,将文本拆分为句子数组,拆分“.?!”中的字符。

然后我循环遍历每个句子,将句子分成单词数组,并从句子中提取第一个和最后一个单词。有了句子文本的 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+ 段落 Instruments 告诉我 UITextView -positionFromPosition: 操作占用了 492 毫秒的时钟时间,将 UI 和 CPU 锁定在 100%。

问题是我需要围绕第一个词和最后一个词的 CGRect,这样我就可以构建一个 CGPath 来突出显示句子。整个事情都很好,看起来真的很棒,但是当发现 rects 时,它的挂起让我死了。我对使用 UITextView 还很陌生,所以如果有什么我可以做的,要么用范围优化我的搜索,要么以某种方式将我的操作放在后台线程上,我将非常感激。

4

1 回答 1

1

最好使用UITextView'attributedText属性,它需要一个NSAttributedString. 这样,您可以将 设置NSBackgroundColorAttributeName为特定范围内的颜色。

请注意,属性文本方法仅适用于 iOS 6+。

于 2013-05-29T23:27:32.153 回答