我觉得我很困惑,抓住并尝试。我使用以下代码从我的服务器获取信息,但是当我打开我的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()
答案 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()
}