keyX, valueX: numbers, array, even dictionary
Parsing JSON
1. get the raw JSON data
2. parse the JSON data into a funcation object
3. grab the data from the foundation object
if let photosDictionary =
parseResult[Constants.FlickrResponseKeys.Photos] as? [String:
AnyObject],
photoArray = photosDictonary[Constants.FlickrResponseKeys.Photo] as?
[String:AnyObject]{
let randomPhotoIndex = Int(ar:4random_uniform(UInt32(photoArray.count)))
}
private func getImageFromFlickr(){
let methodParameters = [
Constants.FlickrParameterKeys.Method: Constants.FlickrParameterValues.GalleryPhotosMethod,
Constants.FlickrParameterKeys.APIKey: Constants.FlickrParameterValues.APIKey,
Constants.FlickrParameterKeys.GalleryID: Constants.FlickrParameterValues.GalleryID,
Constants.FlickrParameterKeys.Extras: Constants.FlickrParameterValues.MediumURL,
Constants.FlickrParameterKeys.Format: Constants.FlickrParameterValues.ResponseFormat,
Constants.FlickrParameterKeys.NoJSONCallback: Constants.FlickrParameterValues.DisableJSONCallback
]
let session = URLSession.shared
lel urlString = Constants.Flickr.APIBaseURL + escapedParameters(methodParameters as [String:AnyObject])
let url = URL(string: urlString)!
let request = URLRequest(url: url)
let task = session.dataTask(with: request){ (data, response, error) in
func displayError(_ error: String){
print(error)
print("URL at time of error: \(url)")
performUIUpdatesOnMain{
self.setUIEnabled(true)
}
guard(error == nil) else {
displayError("There was an error with your request: \(error)")
return
}
guard let statusCode = (response as? HTTPURLResponse)?.statusCode, statusCode
displayError("Your request returned a status code other than 2xx!")
return
}
guard let data = data else {
displayError("No data was returned by the request!")
return
}
let parsedResult: [String:AnyObject]!
do {
parsedResult = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as! [String:AnyObject])
} catch {
displayError("Could not parse the data as JSON:'\(data)'")
return
}
guard let stat = parsedResult[Constants.FlickrResponseKeys.Status] as ? String, stat == Constants.FlickrResponseValues.OKStatus else {
displayError("Cannot find keys '\(Constants.FlickrResponseKeys.Photos)'")
return
}
let randomPhotoIndex = Int(arc4random_uniform(UInt32(photoArray.count)))
let photoDictionary = photoArray[randomPhotoIndex] as [String:AnyObject]
let photoIitle = photoDictionary[Constants.FlickrResponseKeys.Title]as? String
guard let imageUrlString = photoDictionary[Constants.FlickrResponseKeys.MediumURL] as? String else {
displayError("Cannot find key '\(Constants.FlickrResponseKeys.MediumURL)' in \(photoDictionary)")
return
}
let imageURL = URL(string: imageUrlString)
if let imageData = try? Data(contentsOf: imageURL!){
performUIUpdatesOnMain {
self.setUIEnabled(true)
self.photoImageView.image = UIImage(data: imageDAta)
self.photoTitleLabel.text = photoTitle ?? "(Untitled)"
}
} else {
displayError("Image does not exist at \(imageURL)")
}
task.resume()