2017-09-06 1 views
0

J'essaie de trier et de sectionner un UTableView avec une cellule personnalisée par ordre alphabétique. Dans mon ViewController j'ai une fonction qui télécharge les données JSON puis les stocke dans un dictionnaire.Tri de UITableViewData à partir d'AlamoFire avec une fermeture d'échappement

var attendees = [Attendee]() 
var sortedFirstLetters: [String] = [] 
var sections: [[Attendee]] = [[]] 

func downloadAttendeeData(completed: @escaping DownloadComplete) { 
    let headers: HTTPHeaders = [ 

     "Accept": "application/json;odata=verbose", 
     "User-Agent": "iOS;iOS" 

    ] 

    NetworkManager.sharedInstance.manager.request(Attendee_URL, method: .get, headers: headers) 
     .responseJSON { response in 

      let result = response.result 

      if let dict = result.value as? Dictionary<String, AnyObject> { 

       if let list = dict["d"]?["results"] as? [Dictionary<String, AnyObject>] { 

        for att in list { 
         let attendee = Attendee(AttendeeDict: att) 
         self.attendees.append(attendee) 

        } 


        self.tableView.reloadData() 

       } 

      } 

      completed() 
    } 


} 

Ce morceau de code est exactement ce que je dois

let firstLetters = self.attendees.map { $0.titleFirstLetter } 
    let uniqueFirstLetters = Array(Set(firstLetters)) 
    self.sortedFirstLetters = uniqueFirstLetters.sorted() 

    self.sections = self.sortedFirstLetters.map { firstLetter in 
     return self.names 
      .filter { $0.titleFirstLetter == firstLetter } 
      .sorted { $0.titleAD < $1.titleAD } 
    } 

Cependant quand je mets ce code dans viewDidLoad il produit et tableau vide.

override func viewDidLoad() { 
    super.viewDidLoad() 


    tableView.delegate = self 
    tableView.dataSource = self 
    searchBar.delegate = self 

    let firstLetters = self.attendees.map { $0.titleFirstLetter } 
    let uniqueFirstLetters = Array(Set(firstLetters)) 
    self.sortedFirstLetters = uniqueFirstLetters.sorted() 

    self.sections = self.sortedFirstLetters.map { firstLetter in 
     return self.names 
      .filter { $0.titleFirstLetter == firstLetter } 
      .sorted { $0.titleAD < $1.titleAD } 
    } 

    self.downloadAttendeeData { 


    } 



} 

Si je mets le code dans la déclaration self.downloadAttendeeData il produit des données, mais il ne crée pas les sections de table.

Comment puis-je produire les sections après le chargement des données dans tableView? Est-ce le problème?

+0

Pouvez-vous mettre le tableau trié dans 'titleForHeaderInSection:' –

+0

Malheureusement, cela produit une table vide. – user1938745

+1

Quelques idées ... # 1 - Est-ce que vous surchargez correctement le nombre de sectionsIntableView? # 2 - Lorsque toutes les données sont censées être téléchargées et sectionnées, imprimez le contenu des structures de données pour vous assurer qu'elles sont bien construites. # 3- Lorsque toutes les données sont supposées être téléchargées et sectionnées, appelez tableView.reloadData() . Pour vous assurer que ce n'est pas une sorte de problème de synchronisation # 4- Assurez-vous que vous appelez tableView.reloadData() du fil conducteur: dispatch_async (dispatch_get_main_queue()) { self.tableView.reloadData() } –

Répondre

0

Assurez-vous que vous appelez tableView.reloadData() du fil conducteur comme celui-ci:

dispatch_async(dispatch_get_main_queue()) { 
    self.tableView.reloadData() 
}