[Résolu] UITableView et reloadData

Am_MeAm_Me Membre
septembre 2014 modifié dans API UIKit #1

Bonjour à  tous,


 


Voilà  le principe de mon appli


 


Je effectue un NSURLSession sur un lien qui me retourne un XML que je parse et grace à  ce dernier je remplis une mutableArray dans le bloc de la méthode dataWithRequest



NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request
completionHandler:
^(NSData *data, NSURLResponse *response, NSError *error) {
// ...

NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
CustomXmlDelegate *parserDelegate = [[CustomXmlDelegate alloc] init];
[parser setDelegate:parserDelegate];

[parser parse];
NSLog(@End ....);


NSMutableArray *result = [parserDelegate getObjectsParsed];


for(NSObject *s in result) {
[s displayLog];
//myMutableArray est une instance de mon ViewController et c'est avec ca que je rempli mes cell
[myMutableArray addObject:s];
[self.tableView reloadData];
}

}];
[task resume];

Mais ma TableView ne se met à  jour qu'après avoir scrollez (malgré un reloadData). J'en suis sur d'avoir déjà  vu un problème similaire ici mais je ne retrouve plus le post en question.


 


Si qqun pouvait m'éclaircir.


Réponses

  • AliGatorAliGator Membre, Modérateur
    Alors d'une part, c'est très dommage de faire un reloadData à  chaque itération de ta boucle for. Normalement ne la fait qu'à  la fin de ta boucle est amplement suffisant, c'est pas la peine de demander de recharger toutes les cells à  chaque fois que tu ajoutes un objet ;)

    Sinon, je pense que le bloc de completionHandler est appelé sur une NSOperationQueue privée (c'est que laisse penser la doc en tout cas). Or toutes les opérations sur l'UI doivent obligatoirement se faire dans le mainQueue.
    En tout cas ça vaut le coup d'essayer de voir du coup si le fait d'exécuter ton reloadData sur la main queue résoudrait ton problème.
    for(NSObject *s in result) {
    [s displayLog];
    [myMutableArray addObject:s];
    }

    // S'assurer qu'on exécute le reloadData sur la main_queue (donc sur le main thread)
    // Car toute opération liée à  l'UI doit obligatoirement s'exécuter sur le main thread.
    dispatch_async(dispatch_get_main_queue(), ^{
    [self.tableView reloadData];
    });
  • oH d'accord c'est pour ça que j'avais des saccades de fou ! :D


     


    Bon j'aurai encore appris quelque chose merci encore pour ton temps !


  • Du coup l'histoire de la thread ça doit rejoindre aussi les UIImageView ?


    pour la méthode setImage.


     


    Car je charge une image pas très grande http://thetvdb.com/banners/_cache/fanart/original/153021-11.jpg et ça met + de 10 secondes. Normal ou il faut une thread justement ?


  • AliGatorAliGator Membre, Modérateur
    Oui pareil c'est à  faire dans le mainThread aussi comme tout ce qui a attrait à  l'UI.
  • Am_MeAm_Me Membre
    septembre 2014 modifié #6

    Et tout dernière question je sais pas si c'est en relation avec ou pas. Mais il m'arrive 1 fois sur 10 quand je compile puis lance la simulation j'ai un écran noir : mais mes logs s'affiche dans le terminal de Xcode. Mais c'est assez rare. 


     


    C'est un problème connu ou juste un bug du simulateur ?


     


    PS : je charge des images (url internet pareille) dans une UITableView dans le viewDidLoad


  • Je pense que c'est un bug du simulateur.

    Moi aussi je me retrouve de plus en plus avec cet écran noir.

    En général il suffit de passer l'application en background (en retournant sur le springboard), et d'appuyer sur l'icône de l'application et l'image est censée revenir.
  • J'ai compris comment reproduire le "bug" du simulateur.


    En gros arrêter l'application. Ouvrez l'application sans passer par xCode : l'ouvrir directement par le simulateur.


    Puis compilez et lancez via Xcode : pouf écran noir : donc il n'y a pas de quoi s'inquiéter


     


    1) soit recompilez


    2) soit faite la technique de jojolebg au dessus 


Connectez-vous ou Inscrivez-vous pour répondre.