Skip to content

Instantly share code, notes, and snippets.

@victorchee
Created July 6, 2019 05:47
Show Gist options
  • Save victorchee/76a79a1d8e463cc93318066636bec3d7 to your computer and use it in GitHub Desktop.
Save victorchee/76a79a1d8e463cc93318066636bec3d7 to your computer and use it in GitHub Desktop.
import UIKit
extension URLSession {
func dataTask(with url: URL, completionHandler: @escaping (Result<Data, Error>, URLResponse?) -> Void) -> URLSessionDataTask {
return dataTask(with: url) { (data, response, error) in
if let error = error {
completionHandler(.failure(error), response)
} else {
completionHandler(.success(data ?? Data()), response)
}
}
}
}
extension Result where Success == Data {
func decode<T: Decodable>(with decoder: JSONDecoder = .init()) -> Result<T, Error> {
do {
let data = try get()
let decoded = try decoder.decode(T.self, from: data)
return .success(decoded)
} catch {
return .failure(error)
}
}
}
class History: Decodable {
var id = 0
}
class HistoryService {
private let session: URLSession
private let decoder: JSONDecoder
init(session: URLSession, decoder: JSONDecoder) {
self.session = session
self.decoder = decoder
}
let url = URL(string: "https://xxxx.com/history/")!
func fetch(handler: @escaping (Result<History, Error>) -> Void) {
let task = session.dataTask(with: url) { (result, response) in
handler(result.decode())
}
task.resume()
}
}
let service = HistoryService(session: URLSession.shared, decoder: JSONDecoder())
service.fetch { (result) in
switch result {
case .success(let history):
print(history.id)
case .failure(let error):
print(error.localizedDescription)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment