Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- @discardableResult
- private class func request<T: JSONCodable>(urlRequest: URLRequest, router: Router?, completion: @escaping RequestCompletion<T>) -> URLSessionDataTask? {
- let dataTask = URLSession.shared.dataTask(with: urlRequest) { data, response, error in
- DispatchQueue.global(qos: .background).async {
- self.handleResponse(data: data, response: response, error: error, router: router, completion: completion)
- }
- }
- dataTask.resume()
- return dataTask
- }
- private class func handleResponse<T: JSONCodable>(data: Data?, response: URLResponse?, error: Error?, router: Router?, completion: @escaping RequestCompletion<T>) {
- var responseObject: T?
- do {
- responseObject = try T(json: json)
- } catch {
- handleResult(result: .failure(error), response: nil, completion: completion)
- return
- }
- if let responseObject = responseObject {
- handleResult(result: .success(responseObject), response: response, completion: completion)
- } else {
- handleResult(result: .failure(NetworkResponse.unableToDecode), response: response, completion: completion)
- }
- }
- private class func handleResult<T: JSONCodable>(result: Result<T, Error>, response: HTTPURLResponse?, completion: @escaping RequestCompletion<T>) {
- DispatchQueue.main.async {
- switch result {
- case .success(let result):
- completion(.success(result), response)
- case .failure(let error):
- completion(.failure(error), response)
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement