2017-01-17 21 views
0

我Alamofire和SwiftyJSON工作數據,並具有功能:返回從Alamofire.request()

func getCitiesFromServer(){ 

    Alamofire.request("mysite", method: .get, encoding: JSONEncoding.default, headers: nil) 
     .responseJSON { response in 

      switch response.result { 
      case .success: 
       var json = JSON(response.result.value!) 

       for i in 0..<json["cities"].count { 

        self.dictOfCities[json["cities"][i]["id"].int!] = json["cities"][i]["name"].string 
       } 


      case .failure(let error): 
       print(error) 
      } 

    } 

} 

而且我想,當我創建tableViewdictOfCities工作,但如何在getCitiesFromServer()返回dictOfCities?我在getCitiesFromServer()的末尾嘗試print(dictOfCities),但只能看到[:],但在case .success:的部分中我看到了很好的關鍵值。

回答

1

Alamofire使用異步請求過程。 (建議避免阻塞UI)

我建議使用closures

func getCitiesFromServer() { 
    // execute Alamofire request 
} 

成爲

func getCitiesFromServer(completion:((_ success: Bool, _ result: [String]?)->Void)?) { 
    // execute Alamofire request 
    // call closure (if present) with result parameters 
    completion?(success, ["a", "b"]) 
} 

而且這樣調用:

// execute HTTP request via getCitiesFromServer() 
getCitiesFromServer() { (success, result) in 
    // call closure after request execution 
} 
0

我通常與雨燕completionHandler模​​式工作,以異步返回的json。因此,在您的例子中,你只需要在你的函數調用添加completionHandler這樣的:

func getCitiesFromServer(result: ([Int]) ->()){ 

Alamofire.request("mysite", method: .get, encoding: JSONEncoding.default, headers: nil) 
    .responseJSON { response in 

     switch response.result { 
     case .success: 
      var json = JSON(response.result.value!) 
      var dictOfCities = [Int]() 
      for i in 0..<json["cities"].count { 

       dictOfCities[json["cities"][i]["id"].int!] = json["cities"][i]["name"].string 
      } 
      result(dictOfCities); 

     case .failure(let error): 
      print(error) 
     } 

} 

}

這也是在這裏和許多其他的教程中。我還沒有測試過這個代碼,但它可能會給你一個建議如何去做。在您的TableView中,當數據最終進入並使用reloadData()呈現視圖時,您只需對相同的模式做出反應。

在VC:

var rowLabels = [Int]() { 
     didSet { 
      self.tableView.reloadData() 
      //Other functions 
     } 
    } 

在VC來獲取數據:

getCitiesFromServer({ 
      result in 
      if let ids= result{ 
       self.rowLabels = ids 
      } else { 
       self.rowLabels = [Int]() 
      } 
     }) 
+0

http://stackoverflow.com/questions/27390656/how-to-return-value-from-alamofire – Mo0812

+0

好吧,但如何在我的字典在'func tableView(_ tableView:UITableView,numberOfRowsInSection部分:詮釋) - >詮釋{}'返回計數的鍵,例如? –

+0

只需在您的ViewController中創建一個空字典並使用dict.count。我更喜歡在變量中使用didSet觀察器,並在請求函數返回新數據時在那裏調用reloadData()。 - 見上面的更新 – Mo0812