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