使用Alamofire返回对象数组

时间:2017-08-02 16:48:37

标签: ios json swift3 alamofire objectmapper

在我的应用程序中,我正在使用AlamofireObjectMapper。 我想创建一个返回对象数组的方法。在Alamofire的帮助下,我发出了一个GET请求,它将响应作为responseArray。 使用void函数数组listOfType总是有值。 但是当我使用非void函数应该返回对象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!;
}

2 个答案:

答案 0 :(得分: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
    }

希望这有帮助

答案 1 :(得分:0)

尝试关闭

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

          }
       }
    }

}