2015-12-17 76 views
0


我使用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") 
} 
+1

看起來你想要的東西,如[可達](https://developer.apple.com/library/ios/samplecode/Reachability/Introduction/Intro.html) – brandonscript

+0

使用guard let data = data打開數據,其中錯誤== nil else {return} –

+0

在檢查錯誤之前,您正在強制解包數據(例如'data!')。除非你知道,事實上,它永遠不會成爲「零」,否則不要強迫展開。否則你會崩潰。所以,正如Leo建議的那樣,添加一些錯誤處理來確保'data'不是'nil',''error''是'nil'。 – Rob

回答

1

時,才應強制解開一個變量,如果你知道一個100%是有值存在,否則就會導致您的應用崩潰。如果您需要更多這方面的信息,你應該檢討的The Swift Programming Language guide

可選的鏈接部分用於檢查一個

下面的代碼應該爲你工作。

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

發音!的正確方法是「我發誓我的節目的生活。」因爲這就是你在做的事情。爲什麼你覺得你必須使用!?使用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)" 
     } 
    } 
相關問題