Problème de lenteur sur affichage d'une UIScrollView

Bonjour,


 


Je poste mon petit(énorme) problème de lenteur pour avoir des conseils et piste sur sa résolution.


 


Pour faire simple, j'affiche une srollview contenant X fois (X=30 au minimun) la même vue. C'est simplement les données qui changent en fonction du post et des données utilisateurs. (C'est un peu la même scroll view que News Digest)


 


Mon problème, après avoir fait un profile de mon code. C'est cette ligne :



BlogView *blogView = [[NSBundle mainBundle] loadNibNamed:@BlogView owner:self options:nil][0];

Qui est donc lancer X fois dans une boucle for... Je sais c'est affreux. Je me suis mis en tête de lier un xib à  une uiview pour éviter de me taper le code à  la main.


 


Déjà , je suis pratiquement sûr que cette façon est déconseillée car au niveau des perfs c'est juste l'enfer. Pour 1 seule view c'est acceptable mais pas pour X.


 


Est-ce que je ne me suis pas compliqué la vie/entêté en voulant absolument travailler sur xib ? Est-ce qu'il y a une façon plus simple de faire ?


 


Petite note: Cette application est codée en Objective -c.


 


 


Merci beaucoup pour vos retours! ;-)


 


K. 


Réponses

  • CéroceCéroce Membre, Modérateur
    juillet 2015 modifié #2
    Le nib devrait n'être chargé qu'une fois. Il sert ensuite de "prototype" aux autre cellules.
     
    Tu dois utiliser:
    -[UITableView dequeueReusableCellWithIdentifier:forIndexPath:]
    Cette méthode te renverra _toujours_ une cellule, recyclée ou non. Ce n'est pas à  toi de gérer le recyclage, contrairement à  -[dequeueReusableCellWithIdentifier:].

    et appeler auparavant:
    -[UITableView registerNib:forCellReuseIdentifier:]
  • KaroxysKaroxys Membre
    juillet 2015 modifié #3

    Hmm... Je venais de penser d'utiliser une collectionview justement à  la place de la scroll view chargeant toute seule mes 30 vues. Ton idée de table view rejoins la mienne. :-) ça me rassure sur ma réflexion.


     


    Thx pour ton retour Céroce ;-)


     


     


    K.


  • AliGatorAliGator Membre, Modérateur
    Oui une TableView est bien mieux adaptée, aussi parce qu'elle gère le recyclage, ce qui va te soulager à  la fois ton utilisation mémoire et tes performances.

    Mais sinon pour ta culture, utiliser "loadNibNamed:owner:options:" plusieurs fois d'affilée sur le même NIB est loin d'être efficace, car à  chaque fois tu répète à  la fois la tâche de parsing du fichier XIB pour qu'il construire l'arbre de structure des vues... et l'instanciation de ces vues pour les créer pour ton besoin.
    Il est plus malin de mettre en cache le UINib associé au fichier XIB, pour qu'il ne soit parsé qu'une seule fois, et de réutiliser ce UINib à  chaque fois que tu veux instancier une nouvelle fois tes vues.


    UINib* nib = [UINib nibWithNibNamed:@BlogView bundle:nil];
    for (... ta boucle de création de vues ...)
    {
    BlogView *blogView = [nib instanciateWithOwner:self options:nil][0];
    // Puis ajoute ta blogView dans ta scrollView
    }
    Comme ça il n'y a que l'instanciation qui est faite à  chaque fois, pas le parsing du fichier XIB.

    Et au final, c'est ça qu'utilise les UITableView et UICollectionView d'ailleurs pour les cellules (sauf qu'en + elles utilisent aussi le recyclage c'est pour ça que c'est encore mieux de migrer directement vers une TableView pour ton cas)
  • CéroceCéroce Membre, Modérateur
    @Ali: registerNib:forCellReuseIdentifier: fait ça tout seul.
  • Ok, je commence la migration entre midi et 2 et je vous tiens au courant sur le gain au niveau performance ce soir ;-)


     


     


    Merci pour vos retours.


     


    K.


  • AliGatorAliGator Membre, Modérateur
    juillet 2015 modifié #7

    @Ali: registerNib:forCellReuseIdentifier: fait ça tout seul.

    Bah oui c'est exactement ce que j'ai dit à  la fin de mon message

    Et au final, c'est ça qu'utilise les UITableView et UICollectionView d'ailleurs pour les cellules (sauf qu'en + elles utilisent aussi le recyclage c'est pour ça que c'est encore mieux de migrer directement vers une TableView pour ton cas)


    C'était juste pour expliquer justement le concept derrière ;)
  • KaroxysKaroxys Membre
    juillet 2015 modifié #8

    Petit retour (hier à  3h00 du mat, j'ai eu un peu la flemme ^^)


     


    Donc, comme prévu on gagne énormément en perf. J'ai fait des mesures, je passe de ~1,5 secondes à  pratiquement de l'instantanée. Au niveau de l'affichage de la vue.


     


    J'ai quelques problèmes au niveau de mon scroll horizontal qui est un peu moins fluide qu'avant mais ça ne devrait pas me poser de problème pour corriger.


     


     


    Merci pour vos lumières ;-)


     


    K.


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