2009-05-06 5 views
0

Dans mon NiB, j'ai plusieurs contrôleurs View. Lorsque l'application est lancée, tous les appels ViewDidLoad() correspondants sont appelés.Optimisation du temps de chargement de presentModalViewController:

dans ViewControllerA, j'ai ViewA qui contient un UiScrollView avec 100 images. Initalize ces images dans ViewdidLoad. Donc, au lancement de l'application, toutes les images sont initialisées.

Dans mon menu principal View Controller, j'ai un bouton qui lorsqu'il est pressé appels presentModalViewController: ViewControllerA

Cet appel prend 20 secondes.

Je pensais que le pré-chargement dans ViewDidload optimiserait ceci. Cependant, une fois l'appel renvoyé et rappelé (en soulevant ce VC la deuxième fois, c'est vraiment rapide et instantané).

Alors qu'est-ce qui cause ça? Pourquoi cela prend-il autant de temps à appeler presentModalViewController. En interne, essaie-t-il d'organiser toutes les images? Un moyen d'optimiser cela? Dans le cas contraire, ce qui est la meilleure façon de montrer UiActivityIndicator

Merci à l'avance

Répondre

0

D'abord, mettre quelques déclarations NSLog() dans vos méthodes de -viewDidLoad. Ils ne sont probablement pas appelés quand vous pensez qu'ils le sont. Les UIViewControllers sont paresseux. Ils ne chargent pas leur NIB jusqu'à ce que quelqu'un fasse référence à leur vue. Si "tous leurs appels ViewDidLoad() correspondants sont appelés," vous voulez dire que vous appelez [viewController viewDidLoad] à la main, cela ne fonctionnera pas et ne le fera pas. "

C'est une méthode déléguée qui ne devrait être appelée que par le système.

Vous pouvez, mais ne devriez pas, contourner tout cela en appelant [viewController view]. Cela forcera une charge, mais c'est presque toujours la mauvaise réponse.

Quelle est la taille des images? Avez-vous vraiment la mémoire disponible pour tenir tous les 100 tout le temps? Pourriez-vous charger ces images comme vous en avez besoin? Quelle est la forme des images? Un UITableView pourrait-il faire beaucoup de travail pour vous? Si leur dans une grille, vous pourriez montrer 4-5 images par UITableViewCell, et alors vous auriez toutes les optimisations de UITableView.

+0

J'ai tous mes VCs dans un XIB et j'ai vérifié avec des messages NSLog que viewDidLoad OBTIENNENT appelé lors du lancement de l'application :( My App est dans le paysage et je veux un ScrollView qui défile horzontial avec des photos sur elle. Qu'est-ce que recommandation pour ce type d'implémentation – user82383

1

Cela s'est avéré être trop long pour un commentaire.

Je voudrais d'abord jouer avec UITableView pour voir si elle pourrait s'appliquer.

Si c'est complètement en plein écran, alors l'UITableView est en mode portrait, mais faites tourner vos images dans leurs cellules. Ce sera identique au paysage.

Si la vue défilée ne remplit pas l'écran, vous pouvez toujours essayer UITableView avec une transformation de vue pour la faire pivoter. Ensuite, votre prochaine approche devrait être de mettre des espaces réservés dans le scrollview qui chargent paresseusement les images. Si toutes les images ont la même taille, alors c'est très simple, et vous pouvez optimiser la mémoire en ne gardant qu'un nombre limité de ces cellules.

Une autre idée folle: en faire un UIWebView. Cela fera toute la charge paresseuse pour vous.

+0

Merci Rob pour votre réponse, j'apprécie énormément, j'essaie d'optimiser la façon dont je charge mes images dans ma vue scroll (chargement un par un). Je les ai dans ViewDidLoad: Animated, mais je n'arrive pas à les voir s'afficher un par un (donc l'utilisateur voit des progrès) Ils apparaissent tous juste, pourriez-vous mettre en place votre approche de marque de réservation – user82383

+0

Vous avez besoin d'un nouveau UIImageVi Nouvelle sous-classe. Il devrait fournir une image de l'espace réservé de la bonne taille tout en récupérant l'image réelle. Si vous récupérez à partir du disque, vous devez placer l'image réelle sur un fil d'arrière-plan. Si vous récupérez à partir du réseau, vous pouvez utiliser NSURLConnection pour le charger sur le thread principal sans bloquer. Lorsque le chargement de UIImage est terminé, vous appelez setImage: pour remplacer l'espace réservé par le paramètre réel. Vous devrez peut-être appeler setNeedsDisplay: à ce moment-là également pour l'actualiser. –

Questions connexes