Skip to content

Instantly share code, notes, and snippets.

@ertembiyik
Last active May 31, 2022 18:36
Show Gist options
  • Save ertembiyik/e1f9fb9fa47490624e6732662f9ef954 to your computer and use it in GitHub Desktop.
Save ertembiyik/e1f9fb9fa47490624e6732662f9ef954 to your computer and use it in GitHub Desktop.
final class NetworkManager {
let baseURL: String
private var session = URLSession(configuration: URLSessionConfiguration.default,
delegate: nil,
delegateQueue: nil)
private let queue = DispatchQueue(label: "com.organization.network-manager", attributes: .concurrent)
init(baseURL: String) {
self.baseURL = baseURL
}
deinit {
self.session.finishTasksAndInvalidate()
}
func sendRequest<E: Encodable, D: Decodable>(route: Route, params: E, decodeTo: D.Type, completion: @escaping (D?, Error?) -> Void) {
queue.async { [weak self] in
guard let self = self else {
completion(nil, NetworkManagerError.managerIsNil)
return
}
guard let url = URL(string: self.baseURL + route.stringValue) else {
completion(nil, NetworkManagerError.invalidURL)
return
}
var request = URLRequest(url: url)
request.httpMethod = route.method
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")
guard let jsonData = try? JSONEncoder().encode(params) else {
completion(nil, NetworkManagerError.errorEncodingJson)
return
}
request.httpBody = jsonData
let task = self.session.dataTask(with: request) { data, response, error in
guard let data = data, error == nil else {
completion(nil, NetworkManagerError.nilResponse)
return
}
guard let result = try? JSONDecoder().decode(D.self, from: data) else {
completion(nil, NetworkManagerError.errorDecodingJson)
return
}
completion(result, nil)
}
task.resume()
}
}
func sendRequest<D: Decodable>(route: Route, decodeTo: D.Type, completion: @escaping (D?, Error?) -> Void) {
queue.async { [weak self] in
guard let self = self else {
completion(nil, NetworkManagerError.managerIsNil)
return
}
guard let url = URL(string: self.baseURL + route.stringValue) else {
completion(nil, NetworkManagerError.invalidURL)
return
}
var request = URLRequest(url: url)
request.httpMethod = route.method
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")
let task = self.session.dataTask(with: request) { data, response, error in
guard let data = data, error == nil else {
completion(nil, NetworkManagerError.nilResponse)
return
}
guard let result = try? JSONDecoder().decode(D.self, from: data) else {
completion(nil, NetworkManagerError.errorDecodingJson)
return
}
completion(result, nil)
}
task.resume()
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment