Skip to content

Instantly share code, notes, and snippets.

@inacioferrarini
Last active June 23, 2017 23:47
Show Gist options
  • Save inacioferrarini/3b988cb9bfd6d0316245f0e1a09a6333 to your computer and use it in GitHub Desktop.
Save inacioferrarini/3b988cb9bfd6d0316245f0e1a09a6333 to your computer and use it in GitHub Desktop.
import UIKit
class AppBaseApi {
// Properties, Initialization and helpers omited
public func get<Type, TransformerType>(
_ endpointUrl: String,
targetUrl: String,
responseTransformer: TransformerType,
parameters: [String : AnyObject]?,
completionBlock: @escaping ((Type) -> Void),
errorHandlerBlock: @escaping ((Error) -> Void),
retryAttempts: Int) where TransformerType : Transformer, TransformerType.T == AnyObject?, TransformerType.U == Type {
let urlString = endpointUrl + targetUrl
let defaultSession = URLSession(configuration: URLSessionConfiguration.default)
guard let url = URL(string: urlString) else { return }
let dataTask = defaultSession.dataTask(with: url) { (data, response, error) in
if let error = error {
if retryAttempts <= 1 {
errorHandlerBlock(error)
} else {
self.get(endpointUrl,
targetUrl: targetUrl,
responseTransformer: responseTransformer,
parameters: parameters,
completionBlock: completionBlock,
errorHandlerBlock: errorHandlerBlock,
retryAttempts: retryAttempts - 1)
}
} else if let httpResponse = response as? HTTPURLResponse {
guard httpResponse.statusCode >= 200 && httpResponse.statusCode < 300 else { return }
guard let data = data else { return }
guard let jsonData = try? JSONSerialization.jsonObject(with: data, options: []) as AnyObject else { return }
let transformedObject = responseTransformer.transform(jsonData)
completionBlock(transformedObject)
}
}
dataTask.resume()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment