2017-08-02 195 views
3

在我的應用程序中,我使用AlamofireObjectMapper。 我想做一個返回對象數組的方法。在Alamofire的幫助下,我做了一個GET請求,它將響應作爲responseArray。 使用void函數數組listOfType始終有值。 但是當我使用非void函數應該返回對象數組MedicineType,數組listOfType爲零。 所以這裏是我的代碼。返回Alamofire對象數組

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

你需要這樣做的關閉,而不是回報,因爲你的呼籲Alamofire是異步所以你的反應將是異步 –

+0

看爲「Swift + Closure + Async」。如果仔細檢查,'listOfTypes!;'應該被調用BEFORE'listOfTypes = response.result.value;'(你可以添加打印) – Larme

回答

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 
    } 

希望這有助於

+0

@vadian再次編輯,感謝兩次 –

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

      } 
     } 
    } 

}