我从plist文件读取一个String,该字符串有105625个字符,其中325 x 325网格节点信息,我使用循环来获取字符:
for x in 1...325{
for y in 1...325{
let char = string[string.index(string.startIndex, offsetBy: x * y)]
....
}
}
但这很慢,为什么?
答案 0 :(得分:0)
您可以尝试通过此方法使用一些线程来加快速度,如果没有什么需要等待它完成,可以将整个内容放入正常的dispatch_async
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)) {
//put all lengthy calculations here
dispatch_async(dispatch_get_main_queue()) {
//do any UI updates here
}
}
如果你真的想加快计算速度,你将不得不打破for循环来在不同的线程上做循环
let group = dispatch_group_create();
let queue = dispatch_queue_create("processStuff", DISPATCH_QUEUE_CONCURRENT)
for x in 1...325{
dispatch_group_async(group,queue,{
for y in 1...325{
//do stuff
}
})
}
//dispatch_group_wait(group,DISPATCH_TIME_FOREVER); // use this if you want to wait here, blocking the main thread
dispatch_group_notify(group,dispatch_get_main_queue(),{ //use this if you want to be notified when all the groups have finished without blocking the main thread
})
警告:如果你在每个内部for循环中的计算依赖于另一个for循环迭代的迭代或外部for循环的变量,你的计算可能会搞乱,所以要小心。
答案 1 :(得分:0)
我用另一种方法解决了这个问题。
而不是使用字符串下标,我使用:
for char in string.characters{
doing some thing
}
上面的解决方案比字符串快得多[string.index(string.startIndex,offsetBy:x * y - 1)]