2016-05-21 1 views
3

Mon application doit récupérer les données d'un serveur avant de charger la tableview. Comment utiliser dispatch_async pour que l'application mette à jour la vue de la cellule après l'extraction des données.Swift comment dispatch_queue pour mettre à jour la cellule tableview

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
{ 
    let cell = myTable.dequeueReusableCellWithIdentifier("editCell") as! EditTableViewCell 

    cell.answerText.text = dictPicker[indexPath.row]![dictAnswer[indexPath.row]!] 
    cell.questionView.text = listQuestion1[indexPath.row] 
    cell.pickerDataSource = dictPicker[indexPath.row]! 
    dictAnswer[indexPath.row] = cell.pickerValue 
    cell.answerText.addTarget(self, action: #selector(AddFollowUpViewController.textFieldDidChange(_:)), forControlEvents: UIControlEvents.EditingDidEnd) 
    cell.answerText.tag = indexPath.row 
    cell.identifier = true 

    return cell 
} 

Lorsque j'ai utilisé le code ci-dessus, cela me donne une erreur: dictAnswer est nul. dictAnswer est récupéré du serveur. Je pense que la raison est la cellule mise à jour avant dictAnswer récupéré. Mais je ne sais pas comment utiliser le dispatch_async. J'espère qu'il y en a qui peuvent me donner un indice. THX

Répondre

5

vos fonctions de UITableViewDataSource doivent faire référence au nombre de lignes dans votre tableau, comme si

var data:[String]() 

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return data.count 
    } 

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    } 

Donc, dans votre fonction async pour obtenir les données que vous pourriez faire:

func loadData() { 
    // some code to get remote data 
    self.data = result 
    dispatch_async(dispatch_get_main_queue()) { 
     tableView.reloadData() 
    } 
} 

Bien que votre tableau est vide, (data.count retour 0) le tableView essayer l'habitude de charger toutes les lignes et accident

+0

Cela fonctionne! Merci de votre aide –

3

Voici comment recharger des données. Mais n'oubliez pas de rafraîchir votre tableau avant de recharger les données. Rappelez-vous que les données juste aller chercher n'a pas d'importance, la mise à jour des données dans un tableau avant rechargements est également important

dispatch_async(dispatch_get_main_queue(), {() -> Void in 
      self.tableView.reloadData() 
     }) 
0

Après avoir utilisé la réponse de scriptable, je devais faire des mises à jour et je pensais que ce serait une bonne idée de les republier ici ...

Swift 3:

DispatchQueue.main.async(execute: {() -> Void in 
        self.tableView.reloadData() 
       }) 

et

DispatchQueue.main.async { 
    self.tableView.reloadData() 
}