从Alamofire.request()返回数据

时间:2017-01-17 13:25:08

标签: swift alamofire swifty-json

我与Alamofire和SwiftyJSON合作并具有以下功能:

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:部分,我看到了良好的键值。

2 个答案:

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

答案 1 :(得分:0)

我通常使用Swift中的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]()
            }
        })