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。

回答