我遇到了一个奇怪的问题。我正在使用第三方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
}
答案 0 :(得分:4)
更简单的解决方案是删除&#34; davenResults =&#34;在一开始,这就是使JSON无效的原因,JSON必须包含一个JSON对象或数组。
json = result.stringByReplacingOccurrencesOfString("davenresults =", withString:"")
该函数的其余部分正在进行相当打印和缩进JSON,这对它的可解析性没有影响。
您正在进行的处理非常复杂,并且由于反复追加到最终长度为k的字符串,其功能将非常低效。
至于为什么处理时间在两者之间如此不同,模拟器以桌面速度运行并且具有桌面处理能力,真正的设备不会。这是&#34;模拟器&#34;的原因之一。而不是一个周期准确的模拟器&#34;
答案 1 :(得分:2)
我想你不能。因为与实际设备相比,模拟器具有更高的处理能力。所以它需要时间来完成移动过程与你的mac系统相比。