Return array of object using Alamofire

In my application I am using AlamofireObjectMapper. I want to create a method that returns an array of objects. With Alamofire, I made a GET request that gives the response as responseArray. With a void array, the function listOfType

always has values. But when I use a non-void function which should return an array of an object MedicineType

, the array listOfType

is null. So here is my code.

func getAll() -> [MedicineType] {
  var listOfTypes: [MedicineType]?;
  Alamofire.request(BASE_URL, method:.get)
      .responseArray(keyPath:"value") {(response: DataResponse<[MedicineType]>) in
         if let status = response.response?.statusCode {
             switch(status) {
                case 200:
                    guard response.result.isSuccess else {
                    //error handling
                       return
                    }
                    listOfTypes = response.result.value;
                default:
                    log.error("Error", status);
              }
           }
        }
   return listOfTypes!;
}

      

+3


source to share


2 answers


As I said in my comment, you should do this in the closure instead of returning it, because your call to Alamofire is asynchronous so your response will be asynchronous

This is an example, you need to add your error descriptor

    func getAll(fishedCallback:(_ medicineTypes:[MedicineType]?)->Void){
        var listOfTypes: [MedicineType]?;
        Alamofire.request(BASE_URL, method:.get)
            .responseArray(keyPath:"value") {(response: DataResponse<[MedicineType]>) in
                if let status = response.response?.statusCode {
                    switch(status) {
                    case 200:
                        guard response.result.isSuccess else {
                            //error handling
                            return
                        }
                        finishedCallback(response.result.value as! [MedicineType])
                    default:
                        log.error("Error", status);
                            finishedCallback(nil)
                    }
                }
        }
    }

      



Use him

    classObject.getAll { (arrayOfMedicines) in
        debugPrint(arrayOfMedicines) //do whatever you need
    }

      

Hope it helps

+2


source


Try to close

func getAll(_ callback :(medicineTypes:[MedicineType]?) -> Void) -> Void {
Alamofire.request(BASE_URL, method:.get)
  .responseArray(keyPath:"value") {(response: DataResponse<[MedicineType]>) in
     if let status = response.response?.statusCode {
         switch(status) {
            case 200:
                guard response.result.isSuccess else {
                //error handling
                   return
                }
                listOfTypes = response.result.value;
                callback(listOfTypes)
            default:
                log.error("Error", status);
                 callback({})

          }
       }
    }

      



}

0


source







All Articles