Last active
May 31, 2022 18:36
-
-
Save ertembiyik/e1f9fb9fa47490624e6732662f9ef954 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
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