使用 Swift 将字符串拆分为 64kb
Posted
技术标签:
【中文标题】使用 Swift 将字符串拆分为 64kb【英文标题】:Split string in 64kb using Swift 【发布时间】:2015-02-17 10:22:31 【问题描述】:我想将一个非常大的字符串(最大为 8mb)分割成 64kb 的块。目前我正在使用以下代码:
//1
var regData:String= "string up to 8mb"
var count=((countElements(self.regData!))/65536)
//2
for var index = 0; index < count; ++index
arr.append(self.regData!.substringWithRange(Range<String.Index>(start: advance(self.regData!.startIndex, 0),end: advance(self.regData!.startIndex, 65536))))
self.regData!.removeRange(Range<String.Index>(start: self.regData!.startIndex, end:advance(self.regData!.startIndex, 65536)))
println(index)
//3
println("exit loop")
arr.append(self.regData!)
-
我计算我有多少 64 kb 块。
在 for 循环中,我得到了第一个 64kb。我将它们收集在一个数组中。现在由于第 3 步,我必须删除前 64kb 字符串。
如果我的文件小于 64kb,我的循环中会出现错误。因此,我的最后一步是在循环之外。
代码运行良好,但速度极慢。我需要加快我的代码。你知道怎么做吗?
非常感谢。
【问题讨论】:
你不使用NSStream
的原因是什么?
我是 ios 编程新手 :D... 我得看看 NSStream
【参考方案1】:
如果不修改原始字符串可能会更有效,
并且只需使用两个索引(from
和 to
)来遍历字符串:
let regData = "string up to 8mb"
let chunkSize = 65536
var array = [String]()
var from = regData.startIndex // start of current chunk
let end = regData.endIndex // end of string
while from != end
// advance "from" by "chunkSize", but not beyond "end":
let to = from.advancedBy(chunkSize, limit: end)
array.append(regData.substringWithRange(from ..< to))
from = to
请注意,这给出了 65536 个字符的子字符串。自从斯威夫特
字符代表一个“Unicode 字形簇”,这不会
对应64kB的数据。如果你需要,那么你应该转换
NSData
的字符串并将其拆分为块。
(已针对 Swift 2 更新。)
【讨论】:
我会试试这个并给出反馈:D。谢谢 谢谢,这非常快 :D... 你能给我一个如何处理 NSStream 的例子吗?以上是关于使用 Swift 将字符串拆分为 64kb的主要内容,如果未能解决你的问题,请参考以下文章