Created
June 17, 2019 19:27
-
-
Save mcousillas6/40ba608b68ae281ef40f62b8dbc9f9d0 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// URLSessionHelpers.swift | |
// | |
// Created by Mauricio Cousillas on 6/17/19. | |
// Copyright © 2019 Mauricio Cousillas. All rights reserved. | |
// | |
import Foundation | |
import Combine | |
enum APIError: Error { | |
case invalidUrl | |
case unknown(error: Error?) | |
case decoding(error: Error?) | |
case request(statusCode: Int, error: Error?) | |
} | |
extension URLSession { | |
func send(request: URLRequest) -> AnyPublisher<Data, APIError> { | |
Publishers.Future { promise in | |
let task = self.dataTask(with: request) { [weak self] data, response, error in | |
guard let self = self else { | |
promise(.failure(.unknown(error: error))) | |
return | |
} | |
DispatchQueue.main.async { | |
self.handleResponse(data, response, error, promise) | |
} | |
} | |
task.resume() | |
}.eraseToAnyPublisher() | |
} | |
private func handleResponse(_ data: Data?, _ response: URLResponse?, _ error: Error?, _ promise: @escaping (Result<Data, APIError>) -> Void) { | |
guard let httpReponse = response as? HTTPURLResponse else { | |
promise(.failure(.unknown(error: error))) | |
return | |
} | |
guard let data = data, 200..<300 ~= httpReponse.statusCode else { | |
promise(.failure(.request(statusCode: httpReponse.statusCode, error: error))) | |
return | |
} | |
promise(.success(data)) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment