2016-11-28 62 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

相关问题