import Foundation | |
class JSONDownloader { | |
let session: URLSession | |
init(configuration: URLSessionConfiguration) { | |
self.session = URLSession(configuration: configuration) | |
} | |
convenience init() { | |
self.init(configuration: .default) | |
} | |
typealias JSON = [String: AnyObject] | |
typealias JSONTaskCompletionHandler = (JSON?, ItunesError?) -> Void | |
func jsonTask(with request: URLRequest, completionHandler completion: @escaping JSONTaskCompletionHandler) -> URLSessionDataTask { | |
let task = session.dataTask(with: request) { data, response, error in | |
guard let httpResponse = response as? HTTPURLResponse else { | |
completion(nil, .requestFailed) | |
return | |
} | |
if httpResponse.statusCode == 200 { | |
if let data = data { | |
do { | |
let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: AnyObject] | |
completion(json, nil) | |
} catch { | |
completion(nil, .jsonConversionFailure) | |
} | |
} else { | |
completion(nil, .invalidData) | |
} | |
} else { | |
completion(nil, .responseUnsuccessful) | |
} | |
} | |
return task | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment