ios - NSTextStorage 里面有长文本。表现

标签 ios swift performance nstextstorage

我有一个 NSTextStorage里面有长文本(比如一本书有 500 页,当前字体在设备上超过 9000 页)。我以这种方式为 textcontainer 分发此文本:

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

问题是初始化所有这些容器等需要很长时间。我已经做了一些改进,比如更改代码使用

while lastRenderedGlyph < layoutManager!.numberOfGlyphs {

lastRenderedGlyph = NSMaxRange(layoutManager!.glyphRange(for: textContainer))

cz 它的工作速度要慢得多。

那么,我还能做哪些改进?在 iPhone 7 上,启动大约需要 7 秒,在 iPhone 5s 上需要 20 秒 +

时间分析器显示,几乎所有时间都在获取 insertTextContainer 函数 (addTextContainer)。

有什么建议吗?

最佳答案

布局管理器使 addTextContainer 方法调用上的布局无效,并重建 textContainer(forGlyphAt:effectiveRange:) 上的布局。您可以通过为布局管理器设置委托(delegate)并观察 layoutManagerDidInvalidateLayout 来检查它。因此,与其做一次布局,不如做 500 次——每添加一个文本容器一次。

您可以批量添加文本容器以减少布局数量,例如

  var lastTextConainer: NSTextContainer? = nil
  while nil == lastTextConainer {
     for _ in 1...100 {
       let textContainer = NSTextContainer(size: textContainerSize)
       layoutManager.addTextContainer(textContainer)
     }
     lastTextConainer = layoutManager.textContainer(forGlyphAt: layoutManager.numberOfGlyphs - 1, effectiveRange: nil)
  }
  let pagesCount = layoutManager.textContainers.index(of: lastTextConainer!)! + 1

您可以从最后一个文本容器索引开始离开或删除末尾的空文本容器。享受吧!

关于ios - NSTextStorage 里面有长文本。表现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49496569/

相关文章:

ios - 在 Swift 中使用 CocoaPods 时如何实现 Nuance Speechkit

ios - 如果他们引用的对象被释放,守卫是否可以在使用 [weak self] 的闭包中让 `self` = self 导致崩溃?

Xcode:使用 Swift 将默认自定义字体添加到 SKLabelNode

python - 检查两个二维 numpy 数组的公共(public)元素,无论是行还是列

Android Debug模式性能

iphone - 如何从导航栏创建下拉菜单(iOS)

ios - UITabBarController 不显示 "More"按钮

Swift:将 Int16 转换为 Int32(或 NSInteger)

ios - Swift UITableView didSelectRowAtIndexPath 错误

python - C++ - argsort 的 vector 版本实现与 numpy 中的相比效率低