Ios 如何使用NSURLSession处理丢失的Internet连接?
Ios 如何使用NSURLSession处理丢失的Internet连接?,ios,swift,nsurlsession,Ios,Swift,Nsurlsession,我正在使用NSURL从网站上抓取HTML。问题是,如果在NSURL请求期间互联网中断,应用程序就会崩溃。代码: let myUrl = NSURL(string: "http://www.mywebsite.com/page.html") let request = NSMutableURLRequest(URL: myUrl!) request.HTTPMethod = "POST" let task = NSURLSession.sharedSession().dataTaskWithReq
我正在使用NSURL从网站上抓取HTML。问题是,如果在NSURL请求期间互联网中断,应用程序就会崩溃。
代码:
let myUrl = NSURL(string: "http://www.mywebsite.com/page.html")
let request = NSMutableURLRequest(URL: myUrl!)
request.HTTPMethod = "POST"
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
data, response, error in
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)) {
let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding)
if error != nil {
print("Error: \(error)")
}
dispatch_async(dispatch_get_main_queue()) {
self.testLabel.text = "\(responseString!)"
}
}
}
task.resume()
let myUrl = NSURL(string: "http://www.mywebsite.com/page.html")
let request = NSMutableURLRequest(URL: myUrl!)
request.HTTPMethod = "POST"
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
data, response, error in
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)) {
let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding)
if error != nil {
print("Error: \(error)")
}
dispatch_async(dispatch_get_main_queue()) {
self.testLabel.text = "\(responseString!)"
}
}
}
task.resume()
} catch {
timer.invalidate
sendAlert("Error", message: "You are not connected to the internet")
}
我可以使用此代码在NSURL连接之前检查internet连接,但是在操作过程中仍然存在internet断开的可能性:在NSURL之前检查internet连接的代码:
let myUrl = NSURL(string: "http://www.mywebsite.com/page.html")
let request = NSMutableURLRequest(URL: myUrl!)
request.HTTPMethod = "POST"
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
data, response, error in
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)) {
let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding)
if error != nil {
print("Error: \(error)")
}
dispatch_async(dispatch_get_main_queue()) {
self.testLabel.text = "\(responseString!)"
}
}
}
task.resume()
为了解决这个问题,我使用了try/catch操作进行了研究,但是我没有成功构建一个不会给我错误的操作。有没有一种方法可以将整个NSURL操作包装在一个巨大的try/catch中,以捕获任何错误?我是这样想的,但它不起作用:代码:
let myUrl = NSURL(string: "http://www.mywebsite.com/page.html")
let request = NSMutableURLRequest(URL: myUrl!)
request.HTTPMethod = "POST"
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
data, response, error in
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)) {
let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding)
if error != nil {
print("Error: \(error)")
}
dispatch_async(dispatch_get_main_queue()) {
self.testLabel.text = "\(responseString!)"
}
}
}
task.resume()
let myUrl = NSURL(string: "http://www.mywebsite.com/page.html")
let request = NSMutableURLRequest(URL: myUrl!)
request.HTTPMethod = "POST"
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
data, response, error in
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)) {
let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding)
if error != nil {
print("Error: \(error)")
}
dispatch_async(dispatch_get_main_queue()) {
self.testLabel.text = "\(responseString!)"
}
}
}
task.resume()
} catch {
timer.invalidate
sendAlert("Error", message: "You are not connected to the internet")
}
只有当您知道100%的值存在时,才应强制展开变量,否则会导致应用程序崩溃。如果您需要有关此方面的更多信息,请查看 用于检查 下面的代码应该适合您
let myUrl = NSURL(string: "http://www.mywebsite.com/page.html")
let request = NSMutableURLRequest(URL: myUrl!)
request.HTTPMethod = "POST"
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
data, response, error in
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)) {
if let responseData = data {
let responseString = NSString(data: responseData, encoding: NSUTF8StringEncoding)
if error != nil {
print("Error: \(error)")
}
dispatch_async(dispatch_get_main_queue()) {
print("Response: \(responseString!)")
}
}
}
}
task.resume()
在处理互联网连接故障方面,您应该检查关闭时返回的响应,并决定要采取的行动
if let httpResponse = response as? NSHTTPURLResponse {
println("error \(httpResponse.statusCode)")
}
只有当您知道100%的值存在时,才应强制展开变量,否则会导致应用程序崩溃。如果您需要有关此方面的更多信息,请查看 用于检查 下面的代码应该适合您
let myUrl = NSURL(string: "http://www.mywebsite.com/page.html")
let request = NSMutableURLRequest(URL: myUrl!)
request.HTTPMethod = "POST"
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
data, response, error in
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)) {
if let responseData = data {
let responseString = NSString(data: responseData, encoding: NSUTF8StringEncoding)
if error != nil {
print("Error: \(error)")
}
dispatch_async(dispatch_get_main_queue()) {
print("Response: \(responseString!)")
}
}
}
}
task.resume()
在处理互联网连接故障方面,您应该检查关闭时返回的响应,并决定要采取的行动
if let httpResponse = response as? NSHTTPURLResponse {
println("error \(httpResponse.statusCode)")
}
正确的发音方式
代码>是“我以我程序的生命起誓”,因为这就是你在做的。为什么您觉得必须使用代码>?使用guard let
为您解决所有问题:
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
data, response, error in
guard error == nil else {
print("Error: \(error)")
return
}
guard let data = data else {
fatalError("error was nil, but no data. This should never happen")
}
guard let responseString = NSString(data: data, encoding: NSUTF8StringEncoding) else {
print("Couldn't decode data")
return
}
dispatch_async(dispatch_get_main_queue()) {
self.testLabel.text = "\(responseString)"
}
}
正确的发音方式代码>是“我以我程序的生命起誓”,因为这就是你在做的。为什么您觉得必须使用代码>?使用guard let
为您解决所有问题:
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
data, response, error in
guard error == nil else {
print("Error: \(error)")
return
}
guard let data = data else {
fatalError("error was nil, but no data. This should never happen")
}
guard let responseString = NSString(data: data, encoding: NSUTF8StringEncoding) else {
print("Couldn't decode data")
return
}
dispatch_async(dispatch_get_main_queue()) {
self.testLabel.text = "\(responseString)"
}
}
看起来您需要使用guard let data=data展开数据,其中error==nil else{return}在检查错误之前,您正在强制展开数据(例如数据!
)。永远不要强制展开,除非你知道,事实上,它永远不可能是nil
。否则你会崩溃。因此,正如Leo所建议的,添加一些错误处理,以确保数据
不是零
,并且错误
是零
。看起来您希望使用guard let data=data,其中error==nil else{return}来展开数据。您正在强制展开数据
(例如数据!
)在检查错误之前。永远不要强制展开,除非你知道,事实上,它永远不可能是nil
。否则你会崩溃。因此,正如Leo所建议的,添加一些错误处理,确保数据
不是nil
,而错误
是nil
。