2016-09-26 27 views
0

我在我的Swift 3.0项目中使用了tableViewController。我想从请求中获取我的tableview的行数,我正在使用Alamofire 4.0如何从tableView方法的请求中获取行数?

我看到从Alamofire返回值,你必须设置一个completionHandlerHow to return value from Alamofire),但Xcode中不要让我把它放在tableView方法。

这是我与集尝试代码/ 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

返回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

'self.tableView.reloadData()'是我错过的方法。谢谢! –

2

您正在考虑错误的方法。你不需要在tableView上设置completionHandler。

viewController的工作是控制信息流。

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

这将导致tableView再次请求行数,并更新整个tableView的内容。

另请注意,在处理UI时,应始终使用异步联网方法。你的用户界面应该让用户意识到正在处理的东西,然后在完成时更新屏幕。

+0

非常感谢您的详细解释。它对我来说也非常有用:) –

0

这是小举例说明如何做到这一点。

首先创建行的属性和设置初始化值是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 
} 

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

相关问题