У меня длинный текст (вероятно, обычная книга, например,> 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
]
Проблема в : маркировка слов в хранилище всего текста работает очень медленно.Чем больше страниц в книге, тем медленнее она работает.
Также снимок экрана использования процессора от профилировщика.
Любой способулучшить логику?