ServiceSpacex
**** Service Manager **** pod 'ServiceSpaceX'
ServiceSpacex
Service Manager API
Installation
pod 'ServiceSpaceX'
Usage
override func viewDidLoad() {
super.viewDidLoad()
self.showAccounts(page: 1) { (t) in
switch t {
case .success(let list):
print(list.success.description)
break
default:
//"ERROR"
break
}
}
}
func showAccounts(page: Int, completion: @escaping (_ result: APIResult<PtBaseResponse<[PtMyListResponse]>>) -> Void) {
Network<MyService>().request(target: .showAccounts, completion: completion)
}
Network
func request<M: Decodable>(target: T,completion: @escaping (_ result: APIResult<M>) -> Void ) {
self.fetch(target: target, completion: completion)
ReachabilityUtil.reachability.whenUnreachable = { _ in
let alert = UIAlertController(title: "Uyarı", message: "İnternet bağlantısını kontrol ediniz. :(", preferredStyle: .actionSheet)
alert.addAction(UIAlertAction(title: "Tekrar Dene", style: .default , handler:{ (UIAlertAction)in
self.fetch(target: target, completion: completion)
}))
alert.addAction(UIAlertAction(title: "Vazgeç", style: .cancel , handler:{ (UIAlertAction)in
}))
}
}
func fetch<M: Decodable>(target: T,completion: @escaping (_ result: APIResult<M>) -> Void ) {
provider.request(target) { (result) in
switch result {
case .success(let response):
do {
let filteredResponse = try response.filterSuccessfulStatusCodes()
let mappedResponse = try filteredResponse.map(M.self,
atKeyPath: nil,
using: self.jsonDecoder,
failsOnEmptyData: false)
completion(.success(mappedResponse))
} catch MoyaError.statusCode(let response) {
completion(.failure(MoyaError.statusCode(response)))
} catch {
debugPrint("##ERROR parsing##: \(error.localizedDescription)")
let moyaError = MoyaError.requestMapping(error.localizedDescription)
completion(.failure(moyaError))
}
case .failure(let error):
debugPrint("##ERROR service:## \(error.localizedDescription)")
completion(.failure(error))
}
}
}
Refresh Token
public func adapt(_ urlRequest: URLRequest) throws -> URLRequest {
var urlRequest = urlRequest
if let urlString = urlRequest.url?.absoluteString, urlString.hasPrefix("BASE URL"), !urlString.hasSuffix("/renew") {
if let token = accessToken {
urlRequest.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization")
}
}
return urlRequest
}
// MARK: - RequestRetrier
public func should(_ manager: SessionManager, retry request: Request, with error: Error, completion: @escaping RequestRetryCompletion) {
lock.lock() ; defer { lock.unlock() }
if let response = request.task?.response as? HTTPURLResponse, response.statusCode == 401 {
self.requestsToRetry.append(completion)
if !isRefreshing {
refreshTokens { succeeded, accessToken in
self.lock.lock() ; defer { self.lock.unlock() }
if let accessToken = accessToken {
self.accessToken = accessToken
}
self.requestsToRetry.forEach { $0(succeeded, 0.0) }
self.requestsToRetry.removeAll()
}
}
} else {
completion(false, 0.0)
}
}
// MARK: - Private - Refresh Tokens
private func refreshTokens(completion: @escaping RefreshCompletion) {
guard !isRefreshing else { return }
isRefreshing = true
let urlString = "BASEURL-token/renew"
Alamofire.request(urlString, method: .get, parameters: nil, encoding: JSONEncoding.default, headers: ["Authorization":"Bearer \(refreshToken!)"]).responseJSON { response in
if
let json = response.result.value as? [String: Any],
let accessToken = json["accessToken"] as? String
{
completion(true, accessToken)
} else {
completion(false, nil)
}
self.isRefreshing = false
}
}