2016-06-14 69 views
1

我有一个问题。我正在用alamofire回报它的回报价值。在alamofire我将返回的json转换为我的自定义类,它的工作goog。但是当我将这个转换后的类从alamofire body中取出时,它返回了零值。 我在alamofire中放置了断点,在那里我转换了json的值,并且向我的类中添加了它,它具有价值,并将它放到我的类中。但是超出正文它等于零。为什么?alamofire得到请求返回空值

func getZakazDetail(orderID:Int,tableView:UITableView,spinner:UIActivityIndicatorView){ 

    if flag{ 
     let zD=ZakazDetailTableViewController() 
     Alamofire.request(.GET, "myUrl") 
      .responseJSON { response in 
       guard response.result.error == nil else { 
        // got an error in getting the data, need to handle it 
        print("error calling GET on /todos/1") 
        print(response.result.error!) 
        return 
       } 

       if let value = response.result.value { 
        let product = JSON(value) 
        if product != nil{ 
         for (_,subJson):(String, JSON) in product { 
          let p=ZakazDetail(id: subJson["id"].int!, tovar: subJson["tovar"].string!, count: subJson["count"].int!, orderid: subJson["orderid"].int!, cena: subJson["cena"].int!) 
          self.zakazDetail.append(p) 
          zD.detail.append(p) 
         } 
        } 
       } 
     } 
     spinner.stopAnimating() 
     UIApplication.sharedApplication().networkActivityIndicatorVisible = false 
     tableView.reloadData() 

    } 
    else{ 
     let alert = UIAlertView(title: "Ошибка",message: "Нету интернета!",delegate: nil,cancelButtonTitle: "OK") 
     alert.show() 
    } 

} 

回答

0

这是发生,因为alamofire异步加载数据,你追加在zD.detail.append(P)任何东西之前。 为程序添加完成处理程序以等待加载完成。

//here you call authenticateUser with a closure that prints responseObject 
API().authenticateUser{ (responseObject, error) in 
    println(responseObject) 
} 

然后:

//authenticateUser receives your closure as a parameter 
func authenticateUser(completionHandler: (responseObject: String?, error: NSError?) ->()) { 
    //it passes your closure to makeAuthenticateUserCall 
    makeAuthenticateUserCall(completionHandler) 
} 

//makeAuthenticateUserCall receives your closure 
func makeAuthenticateUserCall(completionHandler: (responseObject: String?, 
error: NSError?) ->()) { 
    Alamofire.request(.GET, loginUrlString) 
     .authenticate(user: "a", password: "b") 
     //here you pass a new closure to the responseString method 
     .responseString { request, response, responseString, responseError in 
      //in this closure body you call your completionHandler closure with the 
      //parameters passed by responseString and your code gets executed 
      //(that in your case just prints the responseObject) 
      completionHandler(responseObject: responseString as String!, error: responseError) 
    } 
} 

欲了解更多信息,请阅读文档:Swift Closures

+0

但也有它已经下载JSON让产品= JSON(值) –

+0

呀很好,你应该告诉代码在alamofire加载数据之前不会追加任何内容,然后一旦完成,您可以追加它并重新加载数据。 – Dershowitz123

+0

是这样的: func getZakazDetail(orderID:Int,tableView:UITableView,spinner:UIActivityIndi​​catorView,completion:(JSON) - >())let product = JSON(value) 完成(产品) –