2016-09-26 4 views
0

Я использую tableViewController на моем проекте Swift 3.0. Я хочу получить количество строк моего табличного представления из запроса, и для этой цели я использую Alamofire 4.0.Как получить количество строк из запроса в методе tableView?

Я видел, что возвращать значения из Alamofire вы должны установить completionHandler (How to return value from Alamofire), но Xcode не позволяют мне установить его на tableView метод.

Это код, который я попробовал с набором/получить методы:

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 является асинхронным и является проблемой, с которой я столкнулся, но я не могу установить завершение функции Handler по функции tableView.

PS: Я также попытался сделать синхронную Alamofire (making an asynchronous alamofire request synchronous), но завершение блока появляется снова, и я не в состоянии установить его метод Tableview (я не знаю, если это возможно, чтобы установить его на этом методе или я делаю это неправильно).

Я попытался добавить completion:(Int) -> Void в мой метод tableView, но Xcode не позволяет мне это делать.

Что мне сделать, чтобы задать количество строк после выполнения запроса?

Заранее благодарен!

+0

return 0 и когда обработчик завершения называется set your rows –

ответ

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

Вы думаете об этом неправильно. Вам не нужно устанавливать checkHandler в tableView.

Задача viewController заключается в управлении потоком информации.

  • Сделайте свой viewController соответствующим методам делегата tableView.
  • Реализация всех функций обратного вызова.
  • Попросите свой viewController вызвать код alamofire для выполнения запроса async.
  • Имейте viewController обрабатывать блок завершения.
  • При обработке вызова вызовите «tableView.reloadData()», чтобы снова вызвать все методы делегата.

Это приведет к тому, что tableView снова запросит количество строк и обновит содержимое всего tableView.

Также обратите внимание, что при работе с пользовательским интерфейсом вы всегда должны использовать методы асинхронной сети. Ваш пользовательский интерфейс должен информировать пользователя о том, что что-то обрабатывается, а затем обновлять экран при его завершении.

+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 
} 

Это небольшой пример того, как это можно сделать, но попробуйте немного прочитать о архитектуре программного обеспечения.

Смежные вопросы