【问题标题】:Improving performance on NSTextView syntax highlighting via NSAttributedString通过 NSAttributedString 提高 NSTextView 语法高亮的性能
【发布时间】:2013-03-11 12:03:36
【问题描述】:

我正在为应用程序添加一些语法突出显示。在测试课程中,我目前有一个NSTextViewtextDidChange 通知。类似这样:

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

高亮文本的作用是从NSTextView 中获取字符串并对其进行解析并创建NSMutableAttributedString,最后显示该字符串。代码与此类似:(我使用 ParseKit 进行解析。下面的示例仅突出显示代码 cmets)。

- (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。

【问题讨论】:

    标签: syntax-highlighting nstextview nsattributedstring parsekit


    【解决方案1】:
    猜你喜欢
    • 1970-01-01
    • 2011-06-14
    • 2012-04-16
    • 2014-11-25
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    相关资源
    最近更新 更多