2017-07-25 131 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

相關問題