Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios NSTextStorage,内部有长文本。演出_Ios_Swift_Performance_Nstextstorage - Fatal编程技术网

Ios NSTextStorage,内部有长文本。演出

Ios NSTextStorage,内部有长文本。演出,ios,swift,performance,nstextstorage,Ios,Swift,Performance,Nstextstorage,我有一个NSTextStorage,里面有很长的文本(比如一本书有500页,当前字体的设备上有9000多页)。我通过以下方式为textcontainers分发此文本: let textStorageLength = defaultTextStorage?.length ?? 0 while layoutManager!.textContainer(forGlyphAt: textStorageLength - 1, effe

我有一个
NSTextStorage
,里面有很长的文本(比如一本书有500页,当前字体的设备上有9000多页)。我通过以下方式为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
}
问题是初始化所有这些容器需要很长一段时间。我已经做了一些改进,比如从使用

当LastRenderGlyph

LastRenderGlyph=NSMaxRange(layoutManager!.glyphRange(用于:textContainer))

cz的工作速度要慢得多

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

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


有什么建议吗?

版面管理器在
addTextContainer
方法调用上使版面无效,并在
textContainer上重建版面(forGlyphAt:effectiveRange:)
。您可以通过设置布局管理器的委托并观察
LayoutManagerDinValidateLayout
来检查它。因此,您不必只做一次布局,而是要做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

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

您需要一次加载所有500页吗?也许可以创建一个更小的
NSTextStorage
对象数组?例如,每章一个,或每50页,等等。@Koen您的意思是更小的文本存储?是的,这是正确的。@K恩,我需要2个知道的网页数至少。iBooks应用程序是工作良好的顺便说一句。我相信他们正在做同样的方式