关于Swift 2中NSURLSession(请求数据)的几个问题

时间:2016-04-17 19:02:09

标签: swift http get swift2 nsurlsession

我一直关注this tutorial学习Swift,我对他们的工作方式有几个问题。

具体来说:

let paramString = "data=Hello"
request.HTTPBody = paramString.dataUsingEncoding(NSUTF8StringEncoding)

let task = session.dataTaskWithRequest(request) {
    (data, response, error) in

    guard let _:NSData = data, let _:NSURLResponse = response where error == nil else {
        print("Error")
        return
    }
    let dataString = NSString(data: data!, encoding: NSUTF8StringEncoding)
    print(dataString)
}

为什么(data, response, error) in总是在NSURLSessions中使用?这行代码是什么意思?另外,为什么他在下面有一个警卫声明?

整段代码在这里:

func dataRequest() {
    let urlToRequest: String =  " http://www.kaleidosblog.com/tutorial/nsurlsession_tutorial.php"
    let url: NSURL = NSURL(string: urlToRequest)!

    let session = NSURLSession.sharedSession()
    let request = NSMutableURLRequest(URL: url)

    request.HTTPMethod = "POST"
    request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringCacheData

    let paramString = "data=Hello"
    request.HTTPBody = paramString.dataUsingEncoding(NSUTF8StringEncoding)

    let task = session.dataTaskWithRequest(request) {
        (data, response, error) in

        guard let _:NSData = data, let _:NSURLResponse = response where error == nil else {
            print("Error")
            return
        }
        let dataString = NSString(data: data!, encoding: NSUTF8StringEncoding)
        print(dataString)
    }
    task.resume()
}

1 个答案:

答案 0 :(得分:1)

使用NSURLSession进行异步调用,这意味着您创建/启动网络请求并且程序继续运行 - 它不会停止等待响应。然后,当您的响应准备就绪时,将调用/执行完成块。因此,您需要一种方法来访问使用此响应发送给您的数据。您可以使用(data, response, error)属性访问此数据。这只是这些属性的名称,因此您知道如何使用它们。你可以有不同的名字,但这会让其他人感到困惑。

您使用guard语句,因为您无法确定您确实拥有数据或响应。如果发生错误(超时,......),则可能为零。在这种情况下(如果出现错误),您只需打印"错误"到控制台并调用return,这使您离开完成块而不执行行let dataString = NSString(data: data!, encoding: NSUTF8StringEncoding)print(dataString)。当然,如果您有数据和响应,并且error == nil您跳过了guard语句的else块,那么您只需在块中执行最后两行代码。