首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >包含长文本的NSTextStorage。性能

包含长文本的NSTextStorage。性能
EN

Stack Overflow用户
提问于 2018-03-26 16:46:05
回答 1查看 379关注 0票数 4

我有一个NSTextStorage,里面有很长的文本(就像一本书中的500页,在一个设备上有超过9000页的当前字体)。我以这样的方式为文本容器分发文本:

代码语言:javascript
复制
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))

它的工作速度要慢得多。

那么,,我还能做什么改进呢?在iPhone 7上,输入大约需要7秒,在iPhone 5s 20秒+上

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

有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-02 08:34:26

布局管理器使addTextContainer方法调用上的布局无效,并在textContainer(forGlyphAt:effectiveRange:)上重新构建布局。您可以通过设置布局管理器的委托和观察layoutManagerDidInvalidateLayout来检查它。所以,不要只做一次布局,而是对每个添加的文本容器执行500次-一次。

您可以在批中添加文本容器以减少布局的数量。

代码语言:javascript
复制
  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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49496569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档