33 votes

Charger paresseusement les images dans les UITableViewCell

J'ai environ 50 cellules personnalisées dans ma UITableView. Je veux afficher une image et une étiquette dans les cellules où je récupère les images à partir d'URL.

Je veux effectuer un chargement paresseux des images pour que l'interface utilisateur ne se fige pas pendant le chargement des images. J'ai essayé de récupérer les images dans des threads séparés mais je dois charger chaque image à chaque fois qu'une cellule redevient visible (sinon la réutilisation des cellules montre les anciennes images).

Des applications comme Facebook chargent les images uniquement pour les cellules actuellement visibles et une fois que les images sont chargées, elles ne sont pas rechargées. Pourriez-vous me dire comment reproduire ce comportement, s'il vous plaît.

Merci.

Éditer
Essayer de mettre en cache les images dans un objet NSMutableDictionary crée des problèmes lorsque l'utilisateur fait défiler rapidement. Je récupère les images seulement lorsque le défilement s'arrête complètement et je vide le cache en cas d'avertissement de mémoire. Mais l'application reçoit invariablement un avertissement de mémoire (en raison de la taille des images mises en cache) et vide le cache avant de recharger. Si le défilement est très rapide, elle plante.

Toutes autres suggestions sont les bienvenues

34voto

Phil Kulak Points 1813

19voto

Brad Larson Points 122629

Charger les images sur un fil d'arrière-plan est toujours une bonne idée. Si vous ne voulez pas les recharger à chaque fois, je vous suggère de mettre en place un NSMutableDictionary et de stocker les images dedans. Vous pourriez utiliser un identifiant unique, comme l'ID de la ligne ou même le nom de l'image, comme clé pour chaque image.

Lors du chargement d'une cellule, vous enverriez un message objectForKey: au NSMutableDictionary pour récupérer l'image pour cette cellule particulière (en fonction de votre clé unique pour celle-ci). Si cela renvoie nil, cela signifie que l'image est manquante dans le cache et vous avez besoin que votre fil d'arrière-plan récupère. Sinon, vous récupérerez l'image appropriée pour afficher votre cellule de tableau. En cas d'avertissement de mémoire, vous pourriez vider ce cache d'images sans effets indésirables (à part les forcer à être rechargées à nouveau à la demande).

4voto

Gcoop Points 1684

J'ai récemment résolu avec succès le même problème en utilisant une NSOperation personnalisée pour charger les images de manière séquentielle et les stocker dans un NSMutableDictionary statique en tant que cache. Ci-dessous se trouve un lien vers la base du code que j'ai utilisé pour résoudre le problème.

Chargement d'images distantes pour UITableViewCell

Il est préférable de lire tous les fils de discussion du forum pour vous aider à comprendre ce qui se passe réellement.

4voto

magma Points 4410

LostInTransit,

Je rencontre un problème similaire et en explorant les nombreuses solutions possibles, j'ai trouvé ce billet de blog :

davidgolightly.blogspot.com/2009/02/asynchronous-image-caching-with-iphone.html

Je vous suggérerais également de télécharger l'exemple URLCache sur le site web des développeurs d'Apple :

developer.apple.com/iphone/prerelease/library/samplecode/URLCache/

Et voici un autre article sur le problème :

www.markj.net/iphone-asynchronous-table-image/

Je serais ravi que vous partagiez également vos découvertes.

2voto

jbat100 Points 11445

Pour ceux qui sont intéressés, et sont paresseux comme moi, je voudrais suggérer une implémentation open source (licence MIT) d'un réseau paresseux/mémorisé d'images UIImageView : SDWebImage

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X