【问题标题】:App getting crash in consuming API using swift?应用程序在使用 swift 使用 API 时崩溃?
【发布时间】:2018-09-30 22:49:34
【问题描述】:

我是 Swift 编程的新手,当数据可用时,我为我的项目使用了 Api,它运行良好,如果数据不可用,应用程序在 JSONSerialization 中崩溃,问题出在 data?.count != 0 上,因为 data.count 主要是 2 或其他数字,如果我尝试更改导致错误的行。我不知道如何解决这个问题,谁能建议我。

func getData() {

    guard let URL = Foundation.URL(string:"http://xxxxx/xxx?xx=\(userid)") else {
        return
    }

    let request = URLRequest(url: URL)

    let task = URLSession.shared.dataTask(with: request, completionHandler: { data,response,error in

        guard error == nil && data != nil else {
            let alert = UIAlertController(title: "Check your Internet Connection", message: "", preferredStyle: .alert)
            self.present(alert, animated: true, completion: nil)

            let when = DispatchTime.now() + 3

            DispatchQueue.main.asyncAfter(deadline: when) {
                // your code with delay
                alert.dismiss(animated: true, completion: nil)
            }

            return
        }

        print(data?.count)

        if data?.count != 0 {
            let received = try! JSONSerialization.jsonObject(with: data!, options:.allowFragments) //Here getting thread error
            print(received)
        })

        task.resume()
    }
}

【问题讨论】:

  • 试试if data != nil 而不是if data?.count != 0
  • 使用 if letguard let 而不是检查 nil 或 count
  • if let or guard let ...什么意思
  • 这意味着如果数据有值,那么它会创建一个属性,即:if let temp = data 意味着如果数据不是 nil 你有 temp else 跳过 if 中的代码
  • ya....我明白了,谢谢 Tj3n

标签: ios swift api web-services swift3


【解决方案1】:

问题出在这部分。

if data?.count != 0
{
  let received = try! JSONSerialization.jsonObject(with: data!, options:.allowFragments) //Here getting thread error
        print(received)
}

所以使用 if let 或 guard 重写它。

guard let responseData = data else{
   return 
}

现在您可以在 JSONSerialization 方法中使用 responseData。所以整个代码 sn-p 会是这样的

 guard let responseData = data else{
       return 
    }

 let received = try! JSONSerialization.jsonObject(with: responseData, options:.allowFragments)
     print(received)

在 Swift 中,如果 let 和 guard 用于解包选项。使用 ”!”如果展开的值为 nil,则展开可选选项将导致崩溃。我们使用 if let 或 guard 来安全地打开选项。所以作为一个经验法则,你应该只使用“!”当您 101% 确定它不包含 nil 值时,解开可选项。

【讨论】:

    【解决方案2】:

    使用 do catch 块,例如:

    do {
        let session = URLSession()            
        var request = try URLRequest(request: request)
                session.dataTask(with: request, completionHandler: { (data, response, error) in
                    if let data = data {
                        completion(data)
                    } else if let error = error {
                        completion(error)
                    }
                }).resume()
            } catch let error {
       completion(error)
       }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-29
      • 2018-06-08
      • 2014-04-18
      相关资源
      最近更新 更多