Как улучшить производительность addAttribute NSTextStorage - PullRequest
0 голосов
/ 21 мая 2018

У меня длинный текст (вероятно, обычная книга, например,> 200 страниц) в NSTextStorage.Я распространяю этот текст для textContainers следующим образом:

let textStorageLength = defaultTextStorage?.length ?? 0
while layoutManager!.textContainer(forGlyphAt: textStorageLength - 1, 
                                   effectiveRange: nil) == nil {
  let textContainer = NSTextContainer(size: textContainerSize)
  layoutManager!.addTextContainer(textContainer)
  pagesCount += 1
}

Затем я использую эти контейнеры для textViews на pageViewController.

У меня есть несколько слов, помечающих как:

func selectTappableWordsFromList(_ list: [PositionWithWord]) {
  self.defaultTextStorage?.beginEditing()

  list.forEach {
    if !self.shouldInterruptCurrentProcesses {
      self.markWordInDefaultTextStorage(positionWithWord: $0)
    } else {
      self.shouldInterruptCurrentProcesses = false
      self.defaultTextStorage?.endEditing()

      return
    }
  }

  self.defaultTextStorage?.endEditing()
}


 func markWordInDefaultTextStorage(positionWithWord: PositionWithWord) {
    let range = NSMakeRange(positionWithWord.position!.start, 
                            positionWithWord.position!.length)

    defaultTextStorage?.addAttributes(defaultAttributes, range: range)
 }

 let defaultAttributes: [NSAttributedStringKey: Any] = [
    .underlineStyle: NSUnderlineStyle.styleSingle.rawValue,
    .underlineColor: UIColor.BookReader.underline
 ] 

Проблема в : маркировка слов в хранилище всего текста работает очень медленно.Чем больше страниц в книге, тем медленнее она работает.

Также снимок экрана использования процессора от профилировщика.

enter image description here

Любой способулучшить логику?

...