mirror of
https://github.com/jphong1111/awesome-ios-developer.git
synced 2025-07-06 00:09:48 +07:00
Update Router.swift
This commit is contained in:
@ -1,21 +1,23 @@
|
|||||||
//
|
//
|
||||||
// Router.swift
|
// Router.swift
|
||||||
// MapDemoApp
|
//
|
||||||
//
|
//
|
||||||
// Created by JungpyoHong on 4/25/21.
|
// Created by JungpyoHong on 5/11/21.
|
||||||
//
|
//
|
||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
typealias NetworkRouterCompletion<T> = (Result<T, AppError>)->()
|
typealias NetworkRouterCompletion<T> = (Result<T, AppError>) -> Void
|
||||||
|
|
||||||
class Router<EndPoint: EndPointType>: NetworkRouter {
|
class Router<EndPoint: EndPointType>: NetworkRouter {
|
||||||
|
|
||||||
private var task: URLSessionTask?
|
private var task: URLSessionTask?
|
||||||
private let session = URLSession(configuration: .default)
|
private let session = URLSession(configuration: .default)
|
||||||
|
|
||||||
|
func cancel() {
|
||||||
|
self.task?.cancel()
|
||||||
|
}
|
||||||
|
|
||||||
func request<T: Decodable>(_ route: EndPoint, completion: @escaping NetworkRouterCompletion<T>) {
|
func request<T: Decodable>(_ route: EndPoint, completion: @escaping NetworkRouterCompletion<T>) {
|
||||||
|
|
||||||
do {
|
do {
|
||||||
let request = try self.buildRequest(from: route)
|
let request = try self.buildRequest(from: route)
|
||||||
task = session.dataTask(with: request) { data, response, error in
|
task = session.dataTask(with: request) { data, response, error in
|
||||||
@ -45,11 +47,6 @@ class Router<EndPoint: EndPointType>: NetworkRouter {
|
|||||||
print(error)
|
print(error)
|
||||||
completionOnMain(.failure(.parseError))
|
completionOnMain(.failure(.parseError))
|
||||||
}
|
}
|
||||||
case 401...500: return print(NetworkResponse.authenticationError.rawValue)
|
|
||||||
|
|
||||||
case 501...599: return print(NetworkResponse.badRequest.rawValue)
|
|
||||||
|
|
||||||
case 600: return print(NetworkResponse.outdated.rawValue)
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
completionOnMain(.failure(.genericError("Something went wrong")))
|
completionOnMain(.failure(.genericError("Something went wrong")))
|
||||||
@ -58,41 +55,29 @@ class Router<EndPoint: EndPointType>: NetworkRouter {
|
|||||||
} catch {
|
} catch {
|
||||||
completion(.failure(.badRequest))
|
completion(.failure(.badRequest))
|
||||||
}
|
}
|
||||||
task?.resume()
|
self.task?.resume()
|
||||||
}
|
|
||||||
|
|
||||||
func cancel() {
|
|
||||||
self.task?.cancel()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private func buildRequest(from route: EndPoint) throws -> URLRequest {
|
private func buildRequest(from route: EndPoint) throws -> URLRequest {
|
||||||
|
|
||||||
var request = URLRequest(url: route.baseURL.appendingPathComponent(route.path),
|
var request = URLRequest(url: route.baseURL.appendingPathComponent(route.path),
|
||||||
cachePolicy: .reloadIgnoringLocalAndRemoteCacheData,
|
cachePolicy: .reloadIgnoringLocalAndRemoteCacheData,
|
||||||
timeoutInterval: 10.0)
|
timeoutInterval: 10.0)
|
||||||
|
|
||||||
request.httpMethod = route.httpMethod.rawValue
|
request.httpMethod = route.httpMethod.rawValue
|
||||||
do {
|
do {
|
||||||
switch route.task {
|
switch route.task {
|
||||||
case .request:
|
case .request:
|
||||||
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
|
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
|
||||||
case .requestParameters(let bodyParameters,
|
|
||||||
let bodyEncoding,
|
|
||||||
let urlParameters):
|
|
||||||
|
|
||||||
|
case .requestParameters(let (bodyParameters, urlParameters)):
|
||||||
try self.configureParameters(bodyParameters: bodyParameters,
|
try self.configureParameters(bodyParameters: bodyParameters,
|
||||||
bodyEncoding: bodyEncoding,
|
|
||||||
urlParameters: urlParameters,
|
urlParameters: urlParameters,
|
||||||
request: &request)
|
request: &request)
|
||||||
|
|
||||||
case .requestParametersAndHeaders(let bodyParameters,
|
case .requestParametersAndHeaders(let (bodyParameters,
|
||||||
let bodyEncoding,
|
urlParameters,
|
||||||
let urlParameters,
|
additionalHeaders)):
|
||||||
let additionalHeaders):
|
|
||||||
|
|
||||||
self.addAdditionalHeaders(additionalHeaders, request: &request)
|
self.addAdditionalHeaders(additionalHeaders, request: &request)
|
||||||
try self.configureParameters(bodyParameters: bodyParameters,
|
try self.configureParameters(bodyParameters: bodyParameters,
|
||||||
bodyEncoding: bodyEncoding,
|
|
||||||
urlParameters: urlParameters,
|
urlParameters: urlParameters,
|
||||||
request: &request)
|
request: &request)
|
||||||
}
|
}
|
||||||
@ -103,12 +88,15 @@ class Router<EndPoint: EndPointType>: NetworkRouter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private func configureParameters(bodyParameters: Parameters?,
|
private func configureParameters(bodyParameters: Parameters?,
|
||||||
bodyEncoding: ParameterEncoding,
|
|
||||||
urlParameters: Parameters?,
|
urlParameters: Parameters?,
|
||||||
request: inout URLRequest) throws {
|
request: inout URLRequest) throws {
|
||||||
do {
|
do {
|
||||||
try bodyEncoding.encode(urlRequest: &request,
|
if let bodyParameters = bodyParameters {
|
||||||
bodyParameters: bodyParameters, urlParameters: urlParameters)
|
try JSONParameterEncoder.encode(urlRequest: &request, with: bodyParameters)
|
||||||
|
}
|
||||||
|
if let urlParameters = urlParameters {
|
||||||
|
try URLParameterEncoder.encode(urlRequest: &request, with: urlParameters)
|
||||||
|
}
|
||||||
} catch {
|
} catch {
|
||||||
throw error
|
throw error
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user