John
John

Reputation: 1

A few questions on NSURLSession (request data) in Swift 2

I have been following this tutorial to learn Swift and I have a few questions on the way they do things.

Specifically here:

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

Why is (data, response, error) in always used in NSURLSessions? What does this line of code mean? Also, why does he have a guard statement underneath?

The whole section of code is here:

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()
}

Upvotes: 0

Views: 189

Answers (1)

Andrej
Andrej

Reputation: 7426

With NSURLSession you make asynchronous calls, meaning that you make / start a network request and your program continues running - it doesn't stop waiting for response. Then, when your response is ready a completion block gets called / executed. So you need a way to access the data that's coming to you with this response. This data is accessible to you with (data, response, error) properties. This are just the names of those properties, so that you know how to use them. You could have different names, but it would be confusing to anyone else.

You use the guard statement because you can't be sure that you actually have the data or the response. It could be nil if an error occurred (timeout, ...). In such case (if there's an error) you just print "Error" to the console and call return, which makes you leave the completion block without executing the lines let dataString = NSString(data: data!, encoding: NSUTF8StringEncoding) and print(dataString). Of course, if you have the data and the response and error == nil you skip the else block of the guard statement and you just execute you last two lines of code in the block.

Upvotes: 1

Related Questions