如何从tableView方法中获取请求中的行数?

时间:2016-09-26 10:17:53

标签: ios swift xcode uitableview alamofire

我在tableViewController项目中使用了Swift 3.0。我想从请求中获取tableview的行数,并且为此目的使用Alamofire 4.0

我看到要从Alamofire返回值,您必须设置completionHandlerHow 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不允许我这样做。

在执行请求后,我该怎么做才能设置行数?

提前致谢!

3 个答案:

答案 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的工作是控制信息流。

  • 使viewController符合tableView委托方法。
  • 实现所有回调函数。
  • 让viewController调用alamofire代码来执行异步请求。
  • 让viewController处理完成块。
  • 处理完毕后,调用“tableView.reloadData()”再次调用所有委托方法。

这将导致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
}

这是一个很小的例子,它是如何做到的,但尝试阅读一些软件架构。