我一直关注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()
}
答案 0 :(得分:1)
使用NSURLSession
进行异步调用,这意味着您创建/启动网络请求并且程序继续运行 - 它不会停止等待响应。然后,当您的响应准备就绪时,将调用/执行完成块。因此,您需要一种方法来访问使用此响应发送给您的数据。您可以使用(data, response, error)
属性访问此数据。这只是这些属性的名称,因此您知道如何使用它们。你可以有不同的名字,但这会让其他人感到困惑。
您使用guard
语句,因为您无法确定您确实拥有数据或响应。如果发生错误(超时,......),则可能为零。在这种情况下(如果出现错误),您只需打印"错误"到控制台并调用return
,这使您离开完成块而不执行行let dataString = NSString(data: data!, encoding: NSUTF8StringEncoding)
和print(dataString)
。当然,如果您有数据和响应,并且error == nil
您跳过了guard
语句的else块,那么您只需在块中执行最后两行代码。