Advertisement
Guest User

Untitled

a guest
Dec 8th, 2018
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Swift 4.00 KB | None | 0 0
  1. class ApiRequest<ResponseModel: AbstractModel> {
  2.     private let afRequest: DataRequest
  3.     init(_ httpMethod: Alamofire.HTTPMethod, _ apiMethod: String, parameters: [String: Any]? = nil, asJSON: Bool? = nil) {
  4.         var encoding: ParameterEncoding = Alamofire.URLEncoding.default
  5.         if asJSON ?? false {
  6.             encoding = Alamofire.JSONEncoding.default
  7.         }
  8.        
  9.         var headers = []
  10.        
  11.         afRequest = Alamofire.request(RestApi.server + apiMethod, method: httpMethod, parameters: parameters, encoding: encoding, headers: headers)
  12.        
  13.         afRequest.validate().responseJSON { (response) in
  14.             self.debugCallbacks.forEach { $0(response.request!, response.response, response.error) }
  15.             switch response.result {
  16.             case .success(let value):
  17.                 if let errorMessage = (value as? [String: AnyObject])?["errors_string"] as? String {
  18.                     self.apiErrorCallbacks.forEach { $0(errorMessage) }
  19.                 } else {
  20.                     self.successCallbacks.forEach { $0() }
  21.                     let decoder = JSONDecoder()
  22.                     decoder.keyDecodingStrategy = .convertFromSnakeCase
  23.                     do {
  24.                         let model = try decoder.decode(ResponseModel.self, from: response.data!)
  25.                         self.successCallbacks2.forEach { $0(model) }
  26.                     } catch {
  27.                         self.serverErrorCallbacks.forEach { $0() }
  28.                     }
  29.                 }
  30.             case .failure(let error):
  31.                 if let error = error as? URLError {
  32.                     switch error.code {
  33.                     case .notConnectedToInternet:
  34.                         self.networkErrorCallbacks.forEach { $0() }
  35.                     case .cancelled:
  36.                         // nothing
  37.                         break;
  38.                     default:
  39.                         break;
  40.                     }
  41.                 } else {
  42.                     self.serverErrorCallbacks.forEach { $0() }
  43.                 }
  44.             }
  45.         }
  46.     }
  47.    
  48.     func cancel() {
  49.         afRequest.cancel()
  50.     }
  51.    
  52.     private var debugCallbacks: [(URLRequest, HTTPURLResponse?, Error?) -> ()] = []
  53.     private var successCallbacks: [() -> ()] = []
  54.     private var successCallbacks2: [(ResponseModel) -> ()] = []
  55.     private var apiErrorCallbacks: [(String) -> ()] = []
  56.     private var serverErrorCallbacks: [() -> ()] = []
  57.     private var networkErrorCallbacks: [() -> ()] = []
  58.    
  59.     func debug(_ callback: @escaping (_ request: URLRequest, _ response: HTTPURLResponse?, _ error: Error?) -> ()) -> Self {
  60.         debugCallbacks.append(callback)
  61.         return self
  62.     }
  63.     func success(_ callback: @escaping () -> ()) -> Self {
  64.         successCallbacks.append(callback)
  65.         return self
  66.     }
  67.     func success(_ callback: @escaping (ResponseModel) -> ()) -> Self {
  68.         successCallbacks2.append(callback)
  69.         return self
  70.     }
  71.     func apiError(_ callback: @escaping (String) -> ()) -> Self {
  72.         apiErrorCallbacks.append(callback)
  73.         return self
  74.     }
  75.     func serverError(_ callback: @escaping () -> ()) -> Self {
  76.         serverErrorCallbacks.append(callback)
  77.         return self
  78.     }
  79.     func networkError(_ callback: @escaping () -> ()) -> Self {
  80.         networkErrorCallbacks.append(callback)
  81.         return self
  82.     }
  83. }
  84.  
  85. class AbstractModel: Decodable {
  86.     init() {
  87.         fatalError()
  88.     }
  89. }
  90.  
  91. class Page<Model: AbstractModel>: AbstractModel {
  92.     var results: [Model]
  93.     var pagesCount: Int
  94.    
  95.     enum CodingKeys: String, CodingKey {
  96.         case results
  97.         case pagesCount = "pages"
  98.     }
  99.    
  100.     required init(from decoder: Decoder) throws {
  101.         let container = try decoder.container(keyedBy: CodingKeys.self)
  102.         self.results = try container.decode([Model].self, forKey: .results)
  103.         self.pagesCount = try container.decode(Int.self, forKey: .pagesCount)
  104.         try super.init(from: decoder)
  105.     }
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement