Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何使用NSURLSession处理丢失的Internet连接?_Ios_Swift_Nsurlsession - Fatal编程技术网

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