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
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:]
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.
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.
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)
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.
C'était juste pour expliquer justement le concept derrière
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.