如何使用Alamofire进行同步请求?

我正在尝试使用Alamofire进行同步请求。 我看了Stackoverflow,发现这个问题: 使asynchronousalamofire请求同步 。

我看到接受的答案使用completion使Alamofire请求同步,但我不能让它工作。 这是我的简化代码:

 func loadData(completion: (Bool)) -> (Int, [String], [String], [String]){ Alamofire.request(url!, method: .get, parameters: nil, encoding: JSONEncoding.default, headers: nil).responseJSON { response in switch(response.result) { case .success(_): if let JSON = response.result.value as! [[String : AnyObject]]!{ //Here I retrieve the data } completion(true) break case .failure(_): print("Error") completion(false) break } } return (numberRows, nameArray, ageArray, birthdayArray) } 

有了这个代码,我试图completion(bool value)时出现错误。 我得到的错误如下:

不能调用非函数types的值'Bool'

我已经尝试使用大量的例子使用完成同步获取值(因为我需要检索数据之前,以显示在一张桌子上,同时得到该表的行数)没有成功。

如何使用该完成来获得同步响应?

提前致谢!

当你使用完成处理程序时不要使用return。

 func loadData(completion: @escaping (_ number: Int, _ strArr1: [String], _ strArr2: [String], _ strArr3: [String]) -> ()){ Alamofire.request(url!, method: .get, parameters: nil, encoding: JSONEncoding.default, headers: nil).responseJSON { response in switch(response.result) { case .success(_): if let JSON = response.result.value as! [[String : AnyObject]]!{ //Here I retrieve the data } completion(number: numberRows, strArr1 : nameArray, strArr2 : ageArray, strArr3: birthdayArray) break case .failure(_): print("Error") completion(number: numberRows, strArr1 : nameArray, strArr2 : ageArray, strArr3: birthdayArray) break } } } loadData (completion: { (number, strArr1, strArr2, strArr3) in // do it // for exapmple self.number = number self.strArr1 = strArr1 // and so on }) 

或者如果你想在闭包中返回任何值,你必须使用完成处理程序返回任何值或一些东西,例如,如果你想返回布尔值:

 func loadData(completion:(number: numberRows, strArr1 : nameArray, strArr2 : ageArray, strArr3: birthdayArray) -> (Bool)) 

并在loadData

 loadData( completion: { ( number, strArr1, strArr2, strArr3 ) -> (Bool) in # code return False }) 

或者其他一些想法。

我使用的是swift 3.但是如果你想另外一个版本的swift,比如: @escaping (_ number: Int, _ strArr1: [String], _ strArr2: [String], _ strArr3: [String]) -> ())

如果你想设置外部参数名称,只需要drop _并为参数设置名称。

请注意,苹果非常沮丧地提出同步请求,原因如下。

在这个例子中,我简化了调用,如果你有更多的信息,比如单元格的内容,我build议你看一下SwiftyJSON并返回整个JSON Blob,然后parsing它的相关方法(numberOfRows等)。

 class TableViewJSONAsynchCalls: UIViewController, UITableViewDelegate, UITableViewDataSource { var tableView = UITableView() var numberOfRows = 0; override func viewDidLoad() { loadData { (didCompleteRequest) in if (didCompleteRequest) { tableView.delegate = self tableView.dataSource = self tableView.reloadData() } else { // Handle error if data was not loaded correctly } } } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return numberOfRows; } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { return UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "cell") } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { print("selected") } func loadData(completion: (Bool) -> Void) { // Make asynchronous call using alamofire // This simulates you parsing the JSON and setting the relevant variables, // personally I would recommend you return a JSON blob and then // parse it in the relevant methods. sleep(2) // If call is successful self.numberOfRows = 10 completion(true) } }