2010-07-08 5 views
0

J'ai une tableView avec quelques grandes images dedans. Je me bats pour améliorer la performance de défilement saccadée très. Si j'utilise ImageNamed pour charger les images, le défilement est saccadé au début, mais après le visionnage des images, le défilement est fluide. Je sais qu'ImageNamed ajoute les images dans le cache système, alors ma question est la suivante: est-il possible de pré-charger les images dans le cache système avant qu'elles ne soient visualisées?Comment puis-je charger des images dans le cache système de l'iPhone?

J'ai essayé en ajoutant le code suivant à ma méthode de viewDidLoad:

for (int i = 0; i < appDelegate.detailSectionsDelegateDict.count; i++) { 
     NSString *imageString = [NSString stringWithFormat:@"%@",[[appDelegate.detailSectionsDelegateDict objectAtIndex:i] objectForKey:@"MainTrackImage"]]; 
     NSString *bundlePath = [[NSBundle mainBundle] bundlePath]; 
     UIImage* theImage; 
     theImage = [UIImage imageNamed:imageString]; 
     [imageCacheArray insertObject:theImage atIndex:i]; 
} 

Je puis dessiner l'image correcte de la imageCacheArray dans ma méthode de cellForRowAtIndexPath. Mais le résultat est encore défilement saccadé.

Merci!

Répondre

3

Obtenir une vue de table avec des images (en particulier les plus grandes) pour faire défiler en douceur n'est pas aussi triviale que vous pourriez le penser. Charger un tas d'images avec [UIImage imageNamed:] provoquera très rapidement le tremplin pour tuer votre application car elle commence à dépasser la capacité de la mémoire. Jetez un oeil à l'animation de base session videos from this year's WWDC, en particulier à la session 425, "Core Animation dans la pratique, partie 2" Ils couvrent ce sujet précis et c'est très bien fait. Vous pouvez également obtenir le code source approprié si vous vous connectez avec votre compte de développeur.

+0

Je télécharge les vidéos maintenant. Merci pour le conseil. Juste une note, j'ai également essayé d'utiliser imageWithContentsOfFile et imageWithData avec la seule différence notable étant que le défilement est toujours saccadé au lieu d'être lisse une fois que les images ont été vues une fois. – Jonah

+0

Lorsque vous chargez les images à l'aide de ces méthodes, il bloque l'interface utilisateur et ne met pas en cache. Vous devez faire la mise en cache vous-même. Dans cette même vidéo de session que j'ai recommandée, ils couvrent comment charger les images dans un thread séparé - à environ 36 minutes. –

+0

Le problème que j'ai en suivant le code de l'exemple de code est que je ne peux pas le faire dessinez toutes les cellules avant qu'elles ne soient chargées. Dans leur code, ils utilisent un viewController personnalisé dans lequel toutes les images sont dessinées (qu'elles soient vues ou non). Donc, tout ce qui se passe, c'est que la cellule est chargée paresseusement lorsqu'elle est vue. Des suggestions sur la façon de contourner cela? J'ai essayé de créer un tableau de tableViewCells avec les images correctes lors du chargement de la table puis de dessiner à partir du tableau dans cellForRowAtIndexPath, mais la performance était vraiment mauvaise. Merci pour l'aide! – Jonah