如何捕获数据!url请求中的-nil错误

时间:2017-09-11 20:47:32

标签: swift nsurlsession

我觉得我很困惑,抓住并尝试。我使用以下代码从我的服务器获取信息,但是当我打开我的wifi时,执行后的行{引发了一个零错误。我有另一个脚本,我首先检查可达性,但我正在寻找一种没有它的方法。 “数据!”必须是什么是抛出错误,因为如果没有互联网连接,我想我不能得到和数据回来。但我不知道如何解决这个问题。理想情况下,我想使用URLRequest来识别没有使用我的可达性功能的wifi。我仍然很新闻,并且不知道如何解决这个问题。

URLCache.shared.removeAllCachedResponses()
let requestURL: NSURL = NSURL(string: "url")!
let urlRequest: NSMutableURLRequest = NSMutableURLRequest(url: requestURL as URL)

urlRequest.httpMethod = "POST"
let postString = "club=BLA"
urlRequest.httpBody = postString.data(using: String.Encoding.utf8)

let session = URLSession.shared
let task = session.dataTask(with: urlRequest as URLRequest) {
    (data, response, error) -> Void in

    do{
        // next line causes error in OFFLINE mode
        if let jsonResult = try JSONSerialization.jsonObject(with: data!, options: []) as? NSDictionary {
            print(jsonResult)
        }
    } catch let error as NSError {
        print(error.localizedDescription)
    }
}

task.resume()

2 个答案:

答案 0 :(得分:2)

返回的data对象为nil,可能是因为网络请求失败或某些内容(例如网址)不正确。在您的情况下,这是因为您处于离线状态,因此无法返回data

您可以unwrapping the optional使用guard let(或if let)在使用之前检查此内容:

let task = session.dataTask(with: urlRequest as URLRequest) {
    (data, response, error) -> Void in

    guard data = data else {
        // the returned data was nil, check error object
        return
    }

    do {
        // next line causes error in OFFLINE mode
        if let jsonResult = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] {
            print(jsonResult)
        }
    } catch {
        print(error.localizedDescription)
    }
}

答案 1 :(得分:2)

您的代码的所有内容都需要修复。不要使用NSxxx类。使用适当的Swift类。

不要强制解包选项。使用if let安全地展开值。

这是您的代码使用正确的类型和有效的选项处理重写,以避免崩溃。

URLCache.shared.removeAllCachedResponses()
if let requestURL = URL(string: "url") {
    var urlRequest = URLRequest(url: requestURL)
    urlRequest.httpMethod = "POST"
    let postString = "club=BLA"
    urlRequest.httpBody = postString.data(using: .utf8)

    let session = URLSession.shared
    let task = session.dataTask(with: urlRequest as URLRequest) {  (data, response, error) in
        if let data = data {
            do {
                if let jsonResult = try JSONSerialization.jsonObject(with: data, options: []) as? [String:Any] {
                    print(jsonResult)
                }
            } catch {
                print("Error: \(error)")
            }
        }
    }

    task.resume()
}