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()”再次调用所有委托方法
这将导致tableView再次请求行数,并更新整个tableView的内容


还请注意,在处理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()
是我缺少的方法。非常感谢。非常感谢您的详细解释。它对我也非常有用:)