2010-10-29 13 views
1

Je recherche la meilleure performance de lecture pour un groupe (~ 200) en cache 80px par 80px images. Un grand mandrin (~ 50) devra être accessible à la fois.Stockez les images du cache

Dois-je stocker les ui-images (en tant que données binaires) dans un plist ou en utilisant des données de base?

Répondre

4

Quelques concepts de base:

  • CoreData est probablement la pire façon d'aller pour les données d'image, la documentation indique que les segments de BLOB dans le magasin causent des problèmes de performances énormes.
  • Utilisez le système de fichiers pour ce à quoi il est destiné, accès en lecture/écriture de blocs de données aléatoires.

Le reste dépend de la façon dont vous organisez vos données, alors voici quelques réflexions:

  • 80x80 est assez petite, vous pourriez probablement tenir 50 ou si en mémoire à un moment donné.
  • Vous avez besoin d'un moyen de hacher les images dans un type de structure afin que vous sachiez lesquelles chercher. J'utiliserais des données de base pour stocker les emplacements des images sur le système de fichiers, et reculer votre vue avec un NSFetchedResultsController pour retirer la liste des noms de fichiers.
  • Utilisez une structure de données en mémoire pour stocker les objets UIImage, une file d'attente FIFO d'une taille de 50 fonctionnerait bien ici, car elle obtient une nouvelle image du système de fichiers, elle sort la plus ancienne.
  • Enfin, vous devez savoir quelles images vous allez voir et rester en tête, les lectures du système de fichiers ne seront pas super rapides, donc vous aurez besoin de soit lire vos lectures ou rester assez loin de votre vue pour éviter les retards. Si votre vue affiche 50, vous pouvez conserver 100 en mémoire, 50+ 25 en avant et 25 en cas de défilement par exemple.

Une optimisation prématurée:

  • Si les performances de lecture est essentielle, il serait utile de stocker les images dans « page » morceaux de taille, comme un zip de 5 ou n images qui peuvent être lire dans la mémoire à la fois, puis divisé en leurs fichiers UIImage correspondants.
+1

Je recommanderais un NSDictionary. En supposant que votre modèle de données est CoreData, vous pouvez stocker les images dans le dictionnaire avec la valeur du pointeur comme clé, par ex. '[imageThumbnails objectForKey: [NSNumber numberWithInt: (int) referenceObject]]' Wabbits est complètement correct au sujet des problèmes de performance - si vous ne restez pas en avance sur une tableview et que vous touchez le système de fichiers pendant le défilement, il sera très populaire. Les pouces 80x80 peuvent facilement être préchargés en un seul morceau. –

+1

@Michael, un NSDictionary est une bonne solution car les données sont chargées dans un morceau, cependant NSMutableDictionary n'est pas threadsafe et peut avoir des problèmes si vous essayez de limiter combien d'images sont réellement en mémoire à un moment donné. – ImHuntingWabbits

+0

@Wabbits, c'est vrai. Dans ma propre solution, je construis vraiment les objets avec un dictionnaire mutable et ensuite le stocker comme un non-mutable. J'ai trouvé que vous pouvez charger des tonnes de miniatures sans consommer beaucoup de mémoire. –

Questions connexes