我有个奇怪的问题。我使用的是第三方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
}

最佳答案

一个更简单的解决方案是在开始时删除“davenResults=”,这就是为什么它是无效的JSON,它必须包含一个JSON对象或数组。

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

剩下的所有工作就是打印和缩进JSON,这对它的可解析性没有影响。
您正在进行的处理相当复杂,并且由于重复地附加到一个最终长度为k的字符串,因此运行效率非常低。
至于为什么两者的处理时间如此不同,模拟器以桌面速度运行,而真正的设备却没有桌面处理能力,这是它是“模拟器”而不是周期精确的“模拟器”的原因之一

关于ios - 在iOS模拟器上运行的功能比在iPhone上运行的功能更快,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29529824/

10-11 22:51
查看更多