使用如多看阅读等能即时打开文本文件,而我开发的惠文阅读打开速度就很慢,特别是对大文本文件如天龙八部,要两三分钟才能打开,这是为什么,多看阅读他们采用了什么技术,我应该如何改进,请各位指点,谢谢!读取文件代码如下:
var titleString:NSString="连城诀"
do{
//var titleString:NSString?=try NSString(contentsOfFile: location, encoding: String.Encoding.utf8.rawValue)
titleString=try NSString(contentsOfFile: DataViewController.location+DataViewController.shuming, encoding: String.Encoding.utf8.rawValue) }catch let error {
print(error.localizedDescription)
print("文件读取失败")
}
let layoutManager = NSLayoutManager()
let cunchu:NSTextStorage=NSTextStorage(string:titleString as String);
cunchu.addLayoutManager(layoutManager)
cunchu.addAttribute(NSAttributedString.Key.font, value: UIFont.systemFont(ofSize: DataViewController.zitidaxiao), range: NSMakeRange(0, titleString.length))
let style=NSMutableParagraphStyle()
style.lineSpacing=DataViewController.hangjudaxiao
cunchu.addAttribute(NSAttributedString.Key.paragraphStyle, value: style, range: NSMakeRange(0, titleString.length))
let pageSize = CGSize(width: 384, height: 785)
var ranges: [NSRange] = []
i=0
//var totalpages:Int=1000
while true {
let container=NSTextContainer(size: pageSize)
layoutManager.addTextContainer(container)
let rang=layoutManager.glyphRange(for: container)
if rang.length <= 0 {
DataViewController.totalpages=i
break
}
ranges.append(rang)
i += 1
}
var k:Int=0
while (klet cunchufenduan=cunchu.attributedSubstring(from: ranges[k])
DataViewController.stringfenduan.append(cunchufenduan.string)
k += 1
}
有用请采纳:
这段代码读取文件并进行文本布局和分页操作。瓶颈可能在于文件读取和布局计算上,特别是对于大文本文件。
为了提高打开速度,可以考虑以下几点:
1.优化文件读取:可以使用更快的文件读取方式,例如读取文件的部分内容而非全部内容。
2.优化布局计算:可以使用缓存来降低布局计算的复杂度。
3.优化代码:可以对代码进行优化,例如使用更高效的数据结构和算法。
4.分块读取:对文件进行分块读取,每次读取一部分,不要一次性读取全部文件
这些建议能够帮助您优化代码,提高阅读器的打开速度。
分块读取文件:将大文本文件分成若干块,每次读取一块,再使用TextKit渲染。这样可以减少内存的使用,提高性能。
使用其他文本渲染框架:如CoreText,可以更快的读取和渲染大文本文件。
从你给出的代码中可以看出,你是使用NSString类和NSTextStorage类来读取文件并将其转换为文本。这可能是打开大文本文件的原因之一,因为这些类可能在处理大量数据时会变得缓慢。
一种可能的解决方案是使用流式读取,而不是一次性读取整个文件。这样可以减少内存使用量,并且可以在文件的开头就开始显示文本。
另外,可以通过使用线程来分离文本的读取和显示,来提高程序的效率。
还有,可以考虑使用更高效的文本存储和显示方式,如Core Text或TextKit来替代NSString和NSTextStorage。
此外,可以考虑使用其他更高效的文本处理库,如SQLite等来管理大文本文件.
读取大文件时,不要一次性读入,不管什么文件,什么语言和工具,这都是大忌。所以读取时每次先读取一部分,其次使用多线程预读取,比如用户在阅读当前页,那么下一页的数据就可以预先加载到内存中。
上述代码中,读取文件时使用了 NSString 的 contentsOfFile方法,该方法会将整个文件一次性加载到内存中。对于大文件来说,这样会导致内存占用过大、打开速度慢。
为了提高代码的执行效率,可以对代码进行如下改进:
1、将文本文件读入到缓存中,避免重复读取。
2、使用多线程读取和排版,并行化处理。
3、对文本进行预处理,例如预先分页,可以减少排版和分页次数。