我与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:
部分,我看到了良好的键值。
答案 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]()
}
})