a) default sessions: behaviour like NSURLConnection
b) ephemeral sessions: not cache any content to disk
c) download sessions: store the result in file and transferring data even when app is suspended, exits or crashes
Based on above sessions, developers can schedule three types of tasks:
a) data tasks: retrieve data to memory
b) download tasks: download file to disk
c) upload tasks: uploading file from disk and receiving response as data in memory
Code: Select all
func getImageFromFlickr() {
/* 2 - API method arguments */
let methodArguments = [
"method": METHOD_NAME,
"api_key": API_KEY,
"gallery_id": GALLERY_ID,
"extras": EXTRAS,
"format": DATA_FORMAT
]
/* 3 - Initialize session and url */
let session = NSURLSession.sharedSession()
let urlString = BASE_URL + escapedParameters(methodArguments)
let url = NSURL(string: urlString)!
let request = NSURLRequest(URL: url)
/* 4 - Initialize task for getting data */
let task = session.dataTaskWithRequest(request) { (data, response, error) in
/* 5 - Check for a successful response */
/* GUARD: Was there an error? */
guard (error == nil) else {
print("There was an error with your request: \(error)")
return
}
/* GUARD: Did we get a successful response? */
guard let statusCode = (response as? NSHTTPURLResponse)?.statusCode where statusCode >= 200 && statusCode <= 299 else {
if let response = response as? NSHTTPURLResponse {
print("Your request returned an invalid response! Status code: \(response.statusCode)!")
} else if let response = response {
print("Your request returned an invalid response! Response: \(response)!")
} else {
print("Your request returned an invalid response!")
}
return
}
/* GUARD: Was there any data returned? */
guard let data = data else {
print("No data was returned by the request!")
return
}
/* 6 - Parse the data (i.e. convert the data to JSON and look for values!) */
let parsedResult: AnyObject!
do {
parsedResult = try NSJSONSerialization.JSONObjectWithData(data, options: .AllowFragments)
} catch {
parsedResult = nil
print("Could not parse the data as JSON: '\(data)'")
return
}
/* GUARD: Did Flickr return an error (stat != ok)? */
guard let stat = parsedResult["stat"] as? String where stat == "ok" else {
print("Flickr API returned an error. See error code and message in \(parsedResult)")
return
}
/* GUARD: Are the "photos" and "photo" keys in our result? */
guard let photosDictionary = parsedResult["photos"] as? NSDictionary,
photoArray = photosDictionary["photo"] as? [[String: AnyObject]] else {
print("Cannot find keys 'photos' and 'photo' in \(parsedResult)")
return
}
/* 7 - Generate a random number, then select a random photo */
let randomPhotoIndex = Int(arc4random_uniform(UInt32(photoArray.count)))
let photoDictionary = photoArray[randomPhotoIndex] as [String: AnyObject]
let photoTitle = photoDictionary["title"] as? String /* non-fatal */
/* GUARD: Does our photo have a key for 'url_m'? */
guard let imageUrlString = photoDictionary["url_m"] as? String else {
print("Cannot find key 'url_m' in \(photoDictionary)")
return
}
/* 8 - If an image exists at the url, set the image and title */
let imageURL = NSURL(string: imageUrlString)
if let imageData = NSData(contentsOfURL: imageURL!) {
dispatch_async(dispatch_get_main_queue(), {
self.photoImageView.image = UIImage(data: imageData)
self.photoTitle.text = photoTitle ?? "(Untitled)"
})
} else {
print("Image does not exist at \(imageURL)")
}
}
/* 9 - Resume (execute) the task */
task.resume()
}