功能在iOS模拟器上比在iPhone上运行得更快

时间:2015-04-09 04:32:52

标签: ios iphone json swift

我遇到了一个奇怪的问题。我正在使用第三方Web API,它应该返回一个没有正确设置的JSON对象。因此,我必须重新格式化" JSON"为了让Swift将它识别为JSON对象。在iOS模拟器上,重新格式化JSON字符串的过程大约需要2秒钟,但是当我在物理iPhone上测试时,需要花费25秒。为什么是这样?如何修复它(在物理设备上使JSON格式化程序更快)?

可以在这里看到有缺陷的JSON:http://godaven.com/db/davenapi.aspx?zip=48075&results=20。在运行格式化函数之前,Swift不会将其注册为JSON对象。

以下是我用于重新格式化的代码(我发现了一个javascript版本,并将其移植到swift):

func formatJSON(json: String) -> String
{

    var i = 0, il = 0, tab: Character = "\t", newJson = "", indentLevel: Double = 0, inString = false
    var newString = json.stringByReplacingOccurrencesOfString("davenresults = ", withString: "", options: .allZeros, range: nil)
    var jsonArray = Array(newString)

    for(i = 0; i < jsonArray.count; i++)
    {
        var currentChar = jsonArray[i]

        switch(currentChar)
        {
        case "{":
            if (!inString)
            {
                newJson += "\(currentChar)\n\(tab * (indentLevel + 1))"
                indentLevel++
            }
            else
            {
                newJson += String(currentChar)
            }
        case "[":
            if (!inString)
            {
                newJson += "\(currentChar)\n\(tab * (indentLevel + 1))"
                indentLevel++
            }
            else
            {
                newJson += String(currentChar)
            }
        case "}":
            if (!inString)
            {
                indentLevel--
                newJson += "\n\(tab * indentLevel)\(currentChar)"
            }
            else
            {
                newJson += String(currentChar)
            }
        case "]":
            if (!inString)
            {
                indentLevel--
                newJson += "\n\(tab * indentLevel)\(currentChar)"
            }
            else
            {
                newJson += String(currentChar)
            }
        case ",":
            if (!inString)
            {
                newJson += "\(currentChar)\n\(tab * indentLevel)"
            }
            else
            {
                newJson += String(currentChar)
            }
        case ":":
            if (!inString)
            {
                newJson += ": "
            }
            else
            {
                newJson += String(currentChar)
            }
        case " ":
            if (inString)
            {
                newJson += String(currentChar)

            }
        case "\n":
            if (inString)
            {
                newJson += String(currentChar)
            }
        case "\t":
            if(inString)
            {
                newJson += String(currentChar)
            }
        case "\"":
            if (i > 0 && jsonArray[i - 1] != "\\")
            {
                inString = !inString
            }
            newJson += String(currentChar)
        default:
            newJson += String(currentChar)
        }
    }
    return newJson
}

2 个答案:

答案 0 :(得分:4)

更简单的解决方案是删除&#34; davenResults =&#34;在一开始,这就是使JSON无效的原因,JSON必须包含一个JSON对象或数组。

json = result.stringByReplacingOccurrencesOfString("davenresults =", withString:"")

该函数的其余部分正在进行相当打印和缩进JSON,这对它的可解析性没有影响。

您正在进行的处理非常复杂,并且由于反复追加到最终长度为k的字符串,其功能将非常低效。

至于为什么处理时间在两者之间如此不同,模拟器以桌面速度运行并且具有桌面处理能力,真正的设备不会。这是&#34;模拟器&#34;的原因之一。而不是一个周期准确的模拟器&#34;

答案 1 :(得分:2)

我想你不能。因为与实际设备相比,模拟器具有更高的处理能力。所以它需要时间来完成移动过程与你的mac系统相比。