应用程序在使用 swift 使用 API 时崩溃



我是 Swift 编程的新手,当数据可用时,我已经为我的项目使用了 Api,它工作得很好,如果数据不可用应用程序在 JSON 系列化中崩溃,问题出在数据上?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?.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 
}

现在,您可以在 JSON 系列化方法中使用响应数据。所以整个代码片段看起来像

 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 值时,才应使用 "!" 来解包。

使用 do catch block,例如:

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)
   }

相关内容

  • 没有找到相关文章

最新更新