2017-01-17 5 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) 
      } 

    } 

} 

И я хотел бы работать с dictOfCities когда я создаю tableView, но как вернуть dictOfCities в getCitiesFromServer()? Я пробую print(dictOfCities) в конце getCitiesFromServer(), но посмотрим только [:], но частично case .success: Я вижу хороший ключ-значение.

ответ

1

Alamofire использует асинхронный процесс запроса. (рекомендуется избегать блокировки пользовательского интерфейса)

Предлагаю использовать 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 в Swift вернуть мою 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

ok, но как возвращает количество ключей в моем словаре в 'func tableView (_ tableView: UITableView, numberOfRowsInSection: Int) -> Int {}', например? –

+0

просто создайте в своем ViewController пустой словарь и используйте dict.count. Я предпочитаю использовать наблюдателя didSet в переменной и вызывать reloadData() там, когда моя функция запроса возвращает новые данные. - см. обновление выше – Mo0812