Search code examples
swiftxcodegenericsalamofire

Alamofire Promise make generic request method


I am trying to implement a generic method which is used to get data from API call.

Here is My code.

 class Http {
       class func asyncGetRequest()->Promise<List> {
        return Promise {
            resolve in
            Alamofire.request(GET_PROFFESSIONAL).responseData().done { response in
                guard let blog = try? JSONDecoder().decode(List.self, from: response.data) else {
                    let error = MyError(message: "Error: Couldn't decode")
                    resolve.reject(error)
                    return
                }
                    resolve.fulfill(blog as List)
                }.ensure {

                }.catch { error in
                    resolve.reject(error)
            }
        }
    }
}

I would like to make a generic method for all request. In my code, I made promise type List and JSONDecoder().decode(List.self), Here I would like to make List type dynamic. How can we do that? I would like to reuse asyncGetRequest method for all the API calls. I want to pass request URL (GET_PROFFESSIONAL) and List class type as dynamic.


Solution

  • You could use Generics and write something like this:

    class Http {
        class func asyncGetRequest<ListType: Decodable>() -> Promise<ListType> {
            return Promise { resolve in
                Alamofire.request(GET_PROFFESSIONAL).responseData().done { response in
                    guard let blog = try? JSONDecoder().decode(ListType.self, from: response.data) else {
                        let error = MyError(message: "Error: Couldn't decode")
                        resolve.reject(error)
                        return
                    }
                        resolve.fulfill(blog as ListType)
                    }.ensure {
    
                    }.catch { error in
                        resolve.reject(error)
                }
            }
        }
    }