2017-07-25 25 views
0
let params = ["first":"string", "second":["any":""]] as [String: Any] 
let serverUrl = URL(string: "https://example.execute-api.ap-southeast-2.amazonaws.com/prod")! 
var request = URLRequest(url:serverUrl) 
request.httpMethod = "POST" 
request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") 
request.setValue("secret", forHTTPHeaderField: "X-Api-Key") 
do { 
    request.httpBody = try JSONSerialization.data(withJSONObject: params, options: []) 
} catch _ as NSError { 
    return 
} 

这在第8行新的ios模拟器崩溃,但再次尝试时。我测试了不同的假设,但似乎无法找出原因。JSONSerialization仅在新鲜的ios模拟器上崩溃

我测试:

  1. isValidJsonObject()
  2. 混合嵌套字典
  3. 空字符串
  4. 字典 '<' 字符串,任意> VS [字符串:任何]

崩溃错误消息是'线程1:EXC_BAD_ACCESS(code = EXC_i386_GPFLT)'。我已经检查过线程是否有任何错误,但是我的大中央调度似乎以正确的顺序输出正确的数据。

任何线索?

这个问题只限于模拟器,还是会出现在物理ipad中?

编辑:进一步的谷歌搜索建议这是空字符串有助于返回零的问题。我可以强制空字符串为空值,但是我仍然困扰于上述代码只在新的模拟器中崩溃的事实,但完美地工作后。

+0

你想传递什么你第二个参数? –

+0

嗨,我编辑修复了这个错误,并在完成请求的其余部分添加了。然而,我的测试表明,这是params字典崩溃了JSONSerialization函数。 – yks

回答

0

那么,也许你需要用你的params来编码你的urlRequest。首先,您必须将您的字典投射到[String : Any],然后编辑您的编码。例如,你可以这样做:

let params : [String : Any] = ["first":"string", "second":["any:""]] 
do { 
     request = try URLEncoding.default.encode(urlRequest, with: params) 
    } catch _ as NSError { 
     return 
    } 

现在,如果你的要求有POST或PUT方法,你一定要指定由HTTP主体设置和标题:

urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type") 
urlRequest.httpBody = try JSONSerialization.data(withJSONObject: parameters, 
               options: [.prettyPrinted]) 
+0

你好,你可能会在某物上。在将变量放入测试这个理论之前,我会首先创建一个空的字典var。 – yks

+0

测试结果不确定,无论事先初始化空字典,崩溃仍会发生。 – yks