вернуть массив объектов с помощью Alamofire

В своем приложении я использую AlamofireObjectMapper. Я хочу сделать метод, который возвращает массив объектов. С помощью Alamofire я сделал запрос GET, который дает ответ в виде responseArray. При использовании массива функций void listOfType всегда имеет значения. Но когда я использую непустую функцию, которая должна возвращать массив объекта MedicineType, массив listOfType равен нулю. Итак, вот мой код.

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!;
}

person Liubov Fedorchuk    schedule 02.08.2017    source источник
comment
Вам нужно сделать это в закрытии, а не возвращать его, потому что ваш вызов Alamofire является асинхронным, поэтому ваш ответ будет асинхронным.   -  person Reinier Melian    schedule 02.08.2017
comment
Ищите Swift + Closure + Async. Если вы внимательно проверите, return listOfTypes!; должен вызываться ДО listOfTypes = response.result.value; (вы можете добавить печать)   -  person Larme    schedule 02.08.2017


Ответы (2)


Как я сказал в своем комментарии, вам нужно сделать это в заключении, а не возвращать его, потому что ваш вызов Alamofire является асинхронным, поэтому ваш ответ будет асинхронным.

Это пример, вам нужно добавить свой дескриптор ошибки

    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)
                    }
                }
        }
    }

Используйте

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

Надеюсь это поможет

person Reinier Melian    schedule 02.08.2017

Попробуйте закрыть

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({})

          }
       }
    }

}

person KKRocks    schedule 02.08.2017