我使用NSURL從網站上刮取HTML。問題是,如果在NSURL請求期間互聯網斷開,應用程序崩潰。
代碼:
如何處理與NSURLSession失去互聯網連接?
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()
我可以檢查與此代碼NSURL連接之前的互聯網連接,但仍存在運行過程中互聯網的切割出的可能性:
代碼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()
爲了解決這個問題,我已經使用try/catch操作的研究,但我有沒有運氣成功地建設一個那不給我一個錯誤。有沒有辦法在一個巨大的try/catch中包裝整個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()
} catch {
timer.invalidate
sendAlert("Error", message: "You are not connected to the internet")
}
看起來你想要的東西,如[可達](https://developer.apple.com/library/ios/samplecode/Reachability/Introduction/Intro.html) – brandonscript
使用guard let data = data打開數據,其中錯誤== nil else {return} –
在檢查錯誤之前,您正在強制解包數據(例如'data!')。除非你知道,事實上,它永遠不會成爲「零」,否則不要強迫展開。否則你會崩潰。所以,正如Leo建議的那樣,添加一些錯誤處理來確保'data'不是'nil',''error''是'nil'。 – Rob