2016-11-28 52 views
-1

當我從服務器獲取數據,將顯示下面我的代碼致命錯誤:意外發現零而展開的可選值JSON

URLSession.shared.dataTask(with: myRequest, completionHandler: { (data:Data?, response:URLResponse?, error:Error?) -> Void in 
     DispatchQueue.main.async { 
      if error != nil { 
      } 
      do { 
       if let json = try JSONSerialization.jsonObject(with: (data)!, options: .mutableContainers) as? NSMutableDictionary { 
      } 
     } 
} 

回答

1
let task = URLSession.shared.dataTask(with: request) { (data, response, error) in 
do 
    { 
    let dict = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) 

    Dispatch.main.async { 
     // refresh ui like tableview[tableView.roloadData()] or collectionview 
    } 

    }catch{ 

    } 
} 
task.resume() 
0

致命錯誤 你一個在你的代碼有一些錯誤。

  1. 你檢查錯誤的零和反序列化JSON以外的檢查。

  2. 您正在強制解包(!)數據而不檢查它是否爲零。

  3. 你用do,但是我沒有看到catch。除非你真的需要它,否則請不要使用do/catch。

此外,我建議你使用mainThread時,你已經反序列化的對象。

URLSession.shared.dataTask(with: myRequest) { (data, _, error) -> Void in 
    guard let data = data else { return } 
    let dict = try? JSONSerialization.jsonObject(with: data, options: .mutableContainers) { 
    ... 
    Dispatch.main.async { 
     // refresh ui 
    } 
    } 

} 
+0

不能使用嘗試DO/catch塊之外,無須轉換爲可選,另外JSONSerialization返回任何,所以它必須強制轉換,這一切卻可以在一個以及製作後衛語句來完成:後衛let data = data,讓dict =(try?JSONSerialization.jsonObject(...))爲? [字符串:任何]其他{//錯誤處理} – apocolipse

+0

@apocolipse,我的錯。忘了添加「?」。至於類型轉換 - 這取決於需求。我不喜歡有這麼多括號的巨大線條 – rkyr

+0

JSON鑄造是必要的。使用Swift 3.0,它的默認值爲[Any]或[String:Any],因此返回Any,這樣用戶就可以選擇他們投射的內容。 守衛/讓綁定的美麗做到這一切意味着你可以把所有條件放在一個地方,如果有任何失敗,儘早提供保釋,但它們不需要在一行上,但可以拆分爲三部分,而不是2,這消除了需要包裝的嘗試?聲明以避免雙重選擇權。 – apocolipse

相關問題