Ios 如何在tableView方法中从请求中获取行数?
我在我的Ios 如何在tableView方法中从请求中获取行数?,ios,swift,xcode,uitableview,alamofire,Ios,Swift,Xcode,Uitableview,Alamofire,我在我的Swift 3.0项目上使用tableViewController。我想从请求中获取tableview的行数,为此我使用了Alamofire 4.0 我看到要从Alamofire返回值,必须设置completionHandler(),但是Xcode不允许我在tableView方法上设置它 这是我用set/get方法尝试的代码: var numRows = 0 func setRows(numRows : Int){ self.numRows = numRows } func
Swift 3.0
项目上使用tableViewController
。我想从请求中获取tableview的行数,为此我使用了Alamofire 4.0
我看到要从Alamofire
返回值,必须设置completionHandler
(),但是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
p.S:我也尝试过同步Alamofire(),但完成块再次出现,我无法将其设置为tableView方法(我不知道是否可以将其设置为该方法,或者我使用了错误的方法)
我已经尝试将completion:(Int)->Void
添加到我的tableView方法中,但Xcode不允许我这样做
在执行请求后,我应该如何设置行数
提前谢谢 你想得不对。您不需要在tableView上设置completionHandler viewController的任务是控制信息流
- 使viewController符合tableView委托方法
- 实现所有回调函数李>
- 让您的viewController调用alamofire代码来执行异步请求
- 让viewController处理完成块
- 处理后,调用“tableView.reloadData()”再次调用所有委托方法
还请注意,在处理UI时,应始终使用异步网络方法。您的UI应该让用户意识到正在处理某些内容,然后在完成后更新屏幕。我正在执行类似的操作: 将在tableView中的项目表
var positionsTable = [[String : AnyObject]]()
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return positionsTable.count
}
Alamofire.request(.GET, url, headers: headers, encoding: .JSON)
.responseJSON { (response) in
print(response)
self.positionsTable = response.result.value
self.tableView.reloadData()
}
}
从请求中,我获取项目并重新加载tableView
var positionsTable = [[String : AnyObject]]()
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return positionsTable.count
}
Alamofire.request(.GET, url, headers: headers, encoding: .JSON)
.responseJSON { (response) in
print(response)
self.positionsTable = response.result.value
self.tableView.reloadData()
}
}
这是一个很小的例子,说明如何做到这一点 首先创建行的属性,并将init值设置为0,例如:
var rowCount = 0
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
}
}
}
之后,创建一个优雅的函数,该函数将获取数据并更新行数
,该函数还将更新我们的表视图
示例:
var rowCount = 0
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
}
}
}
并执行第节中的行数
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return rowCount
}
这是一个很小的例子,说明了如何做到这一点,但试着阅读一些关于软件架构的知识 返回0,当调用完成处理程序时,设置行self.tableView.reloadData()
是我缺少的方法。非常感谢。非常感谢您的详细解释。它对我也非常有用:)