我正在做一些文本分析并且遇到了令人讨厌的性能提升,我似乎无法找到如何优化。我从 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 还很陌生,所以如果有什么我可以做的,要么用范围优化我的搜索,要么以某种方式将我的操作放在后台线程上,我将非常感激。