2

我正在为应用程序添加一些语法高亮显示。在测试课上,我目前有NSTextViewtextDidChange通知。与此相似:通过NSAttributedString提高NSTextView语法高亮性能

-(void)textDidChange:(NSNotification *)notification 
{ 
    [self highlightText]; 
} 

做什么亮点的文本,它抓住从NSTextView字符串分析它,并创建一个NSMutableAttributedString,最终显示的字符串。代码与此类似:(我使用ParseKit来完成我的解析,下面的示例只突出了代码注释)。

- (void) highlightText 
{ 
    NSMutableAttributedString * resultString = [[NSMutableAttributedString alloc] initWithString: inputTextView.string]; 

    PKTokenizer *t = [PKTokenizer tokenizerWithString: inputTextView.string]; 
    [t setTokenizerState: t.quoteState from: '[' to: ']']; 

    // We want comments 
    t.commentState.reportsCommentTokens = YES; 

    [t enumerateTokensUsingBlock: ^(PKToken * token, BOOL * stop) 
    { 
     // Comments take presidense. 
     if(token.isComment) 
     { 
      [resultString addAttribute: NSForegroundColorAttributeName 
           value: [self commentColor] 
           range: NSMakeRange(token.offset, token.stringValue.length)]; 
     } 
    }]; 

    // Monospace 
    [resultString addAttribute: NSFontAttributeName 
         value: [NSFont userFixedPitchFontOfSize:0.0] 
         range: NSMakeRange(0, inputTextView.string.length)]; 

    [[inputTextView textStorage] setAttributedString: resultString]; 
} 

现在,如果我用文字少量工作能正常工作,但我想有更大量的文字工作时提高其性能。我对此有两个想法:

  1. 在后台执行处理。当用户键入时,这意味着文本可能会在几秒钟内未格式化。我不太喜欢这个想法。
  2. 仅在文本的可见部分执行高亮显示。用户滚动时突出显示。这仍然存在这样的问题,即当用户滚动时,文本将是未格式化的,但是缓慢地弹出格式化样式。

有没有人有这方面的任何建议?我错过了另一种方式来做到这一点,或者应该这样做吗?有人可能知道任何示例代码做类似/更好的事吗?我正在考虑去选项#2。

回答