Promise kit and Alamofire when used together create a very powerful and flexible API Layer
Every App interacting with web services contains an API layer which separates API handling from the rest of the application logic.
Usually, the API layer is implemented using delegates or escaping closures. Escaping closures and delegates are neat but we can achieve a neater solution by using Alamofire and PromiseKit
Given below is a sample APIManager
import UIKit import PromiseKit import Alamofire //enum to keep all paths organised enum RequestEndPoint: String{ case login = "/Login" } class APIManager: NSObject { static let manager:APIManager = APIManager(); let baseURL = "YOUR BASE URL" func hitApi(endPoint:RequestEndPoint,parameters:[String:Any])->Promise<Any>{ switch endPoint { case .login: //do any cutom thingy unique to login return api(url:URL(string:baseURL + endPoint.rawValue)!, dict: parameters) } } func api(url:URL,dict:[String:Any])->Promise<Any>{ return Promise<Any>{seal in var request = URLRequest(url:url) request.setValue("application/json", forHTTPHeaderField:"Content-Type") let data = try JSONSerialization.data(withJSONObject:dict , options: [])//PromiseKit will take care of throw request.httpBody=data //request is done by now Alamofire.request(request) .validate() .responseJSON(completionHandler: { responseData in switch responseData.result{ case .success: seal.fulfill(responseData.data!) case .failure: seal.reject(responseData.error!) } }) } } }
In the above example, we created an API manager class. Let’s see its usage
override func viewDidLoad() { super.viewDidLoad() _=APIManager.manager.hitApi(endPoint: .login, parameters: ["UserName":"Amarendra","Password":"LoveAll"]) .done({ (Data) in //parse data here }) .catch({ (error) in //do error handling }) .finally { //remove any activity indicator } // Do any additional setup after loading the view, typically from a nib. }