Skip to content

Instantly share code, notes, and snippets.

@mcousillas6
Created June 17, 2019 19:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mcousillas6/40ba608b68ae281ef40f62b8dbc9f9d0 to your computer and use it in GitHub Desktop.
Save mcousillas6/40ba608b68ae281ef40f62b8dbc9f9d0 to your computer and use it in GitHub Desktop.
//
// 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