2015-07-19 4 views
2

Я получаю данные от Alamofire в viewDidLoad, а затем помещаю его в answerArray. Однако перед подключением Alamofire вызывается numberOfRowsInSection и возвращает 0. Как я могу получить данные по Alamofire, а затем получить eventArray.count по адресу numberOfRowsInSection?numberOfRowsInSection вызывается до подключения Alamofire

var answerArray = NSMutableArray() 

override func viewDidLoad() { 
let parameters = [ 
     "id":questionNum 
    ] 

    Alamofire.request(.POST, "http://localhost:3000/api/v1/questions/question_detail",parameters: parameters, encoding: .JSON) 
     .responseJSON { (request, response, JSON, error) in 
      println(JSON!) 
      // Make models from JSON data 
      self.answerArray = (JSON!["answers"] as? NSMutableArray)! 
    } 
    self.tableView.reloadData() 
} 


override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

    return answerArray.count 

} 

ответ

6

Поведение нормальное. UITableView Делегат вызывает numberOfRowsInSection по мере необходимости.

Все, что вам нужно, это вызвать self.tableView.reloadData(), чтобы обновить таблицу.

Alamofire.request(.POST, "http://localhost:3000/api/v1/questions/question_detail",parameters: parameters, encoding: .JSON) 
    .responseJSON { (request, response, JSON, error) in 
     println(JSON!) 
     // Make models from JSON data 
     self.answerArray = (JSON!["answers"] as? NSMutableArray)! 
     self.tableView.reloadData() 
} 
6

Я думаю, что более элегантный способ будет перезаряжать Tableview каждый раз, когда вы присваиваемое answerArray так, что Tableview будет обновляться автоматически каждый раз, когда вы получите ответ от API.

Переместить self.tableView.reloadData() в didSet обратный вызов.

var answerArray = NSMutableArray() { 
    didSet { 
     self.tableView.reloadData() 
    } 
} 
+0

Отличный метод. Я действительно думаю, что это была ошибка в коде @ yomihito. Но тем не менее, очень умная техника. Используя этот подход, исходный 'self.tableView.reloadData()' должен полностью исчезнуть. – SwiftArchitect

+0

Да, это правильно (+1). Но стоит отметить, что это просто немного хрупко, потому что его правильная работа зависит от деталей реализации закрытия обработчика 'responseJSON'. Что, если это закрытие не заменило 'answerArray', а скорее удалило старые объекты и добавило новые? В этом случае это не сработает. Всегда нужно быть осторожным с 'didSet' с изменяемыми объектами, потому что он не обнаруживает изменений внутри объекта, только если объект полностью заменен. Кроме того, в мире MVC объекты модели действительно не должны обновлять объекты просмотра. – Rob

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