字符串下标需要很长时间

时间:2016-11-08 07:20:37

标签: ios swift string char

我从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)]
        ....
    }
}

但这很慢,为什么?

2 个答案:

答案 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)]