我在tableViewController
项目中使用了Swift 3.0
。我想从请求中获取tableview的行数,并且为此目的使用Alamofire 4.0
。
我看到要从Alamofire
返回值,您必须设置completionHandler
(How to return value from Alamofire),但Xcode不允许我在tableView
方法上设置它。
这是我尝试使用set / get方法的代码:
var numRows = 0
func setRows(numRows : Int){
self.numRows = numRows
}
func getRows() -> Int{
return self.numRows
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
var JSON = [[String : AnyObject]]()
Alamofire.request(url!, method: .get, parameters: nil, encoding: JSONEncoding.default, headers: nil).responseJSON { response in
switch(response.result) {
case .success(_):
JSON = response.result.value as! [[String : AnyObject]]!
self.setRows(numRows: JSON.count)
break
case .failure(_):
print("Error")
break
}
}
return self.getRows()
}
但我无法使其发挥作用。我知道Alamofire请求是异步的,这是我面临的问题,但我无法在tableView
函数上设置completionHandler。
PS:我也试过制作同步Alamofire(making an asynchronous alamofire request synchronous)但是再次出现完成块,我无法将其设置为tableView方法(我不知道是否可以可以在该方法上设置它,或者我以错误的方式设置它。)
我尝试将completion:(Int) -> Void
添加到我的tableView方法中,但Xcode不允许我这样做。
在执行请求后,我该怎么做才能设置行数?
提前致谢!
答案 0 :(得分:3)
我做这样的事情:
将在tableView
中的项目表var positionsTable = [[String : AnyObject]]()
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return positionsTable.count
}
从请求我得到项目并重新加载tableView
Alamofire.request(.GET, url, headers: headers, encoding: .JSON)
.responseJSON { (response) in
print(response)
self.positionsTable = response.result.value
self.tableView.reloadData()
}
}
答案 1 :(得分:2)
你正在考虑这个错误的方法。您不需要在tableView上设置completionHandler。
viewController的工作是控制信息流。
这将导致tableView再次请求行数,并更新整个tableView的内容。
另请注意,在处理UI时,应始终使用异步网络方法。您的UI应该让用户知道正在处理的内容,然后在完成后更新屏幕。
答案 2 :(得分:0)
这是一个很好的例子。
首先创建行的属性并设置init值为0,例如:
var rowCount = 0
之后创建一个优雅的函数来获取数据并更新rowCount
,此函数也将更新我们的tableview
示例:
func elegantFuntionToUpdateRowCount() {
var JSON = [[String : AnyObject]]()
Alamofire.request(url!, method: .get, parameters: nil, encoding: JSONEncoding.default, headers: nil).responseJSON { response in
switch(response.result) {
case .success(_):
JSON = response.result.value as! [[String : AnyObject]]!
rowCount = JSON.count
tableView reloadData
break
case .failure(_):
print("Error")
break
}
}
}
并实施numberOfRowsInSection
。
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return rowCount
}
这是一个很小的例子,它是如何做到的,但尝试阅读一些软件架构。