web-dev-qa-db-fra.com

Lazy charger des images dans UITableViewCell

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

Je souhaite effectuer un chargement paresseux d'images afin que l'interface utilisateur ne se fige pas pendant le chargement des images. J'ai essayé d'obtenir les images dans des threads distincts, mais je dois charger chaque image chaque fois qu'une cellule redevient visible (sinon, la réutilisation des cellules affiche les anciennes images)

Des applications comme Facebook ne chargent des images que pour les cellules actuellement visibles. Une fois les images chargées, elles ne sont plus chargées. Quelqu'un peut-il me dire s'il vous plaît comment reproduire ce comportement.

Merci.

Modifier
Essayer de mettre en cache des images dans un objet NSMutableDictionary crée des problèmes lorsque l'utilisateur fait défiler rapidement. Je ne reçois des images que lorsque le défilement est complètement arrêté et que le contenu de la mémoire cache est effacé. Mais l'application reçoit invariablement un avertissement concernant la mémoire (en raison de la taille des images mises en cache) et efface le cache avant de recharger. Si le défilement est très rapide, il se bloque.

N'importe quelles autres suggestions sont les bienvenues

34
lostInTransit

Le chargement des images sur un fil de fond est toujours une bonne idée. Si vous ne voulez pas les recharger à chaque fois, je vous suggère de configurer un NSMutableDictionary et de stocker les images qu'il contient. Vous pouvez utiliser un identifiant unique, tel que l'ID de la ligne ou même le nom de l'image, en tant que clé de chaque image.

Lors du chargement d'une cellule, vous enverriez un message objectForKey: au NSMutableDictionary pour récupérer l'image de cette cellule particulière (en fonction de votre clé unique correspondante). S'il renvoie nil, cela signifie que l'image est manquante dans le cache et que vous avez besoin du thread de chargement de l'image d'arrière-plan pour pouvoir la récupérer. Sinon, vous obtiendrez l'image appropriée que votre cellule de tableau affichera. Sur un avertissement de mémoire, vous pouvez vider ce cache d’images sans effets néfastes (à part les forcer à être rechargées à nouveau à la demande).

21
Brad Larson

Je viens de résoudre avec succès le même problème en utilisant un NSOperation personnalisé pour charger les images dans une fader queing et les stocker dans un NSMutableDictionary statique en tant que cache. Vous trouverez ci-dessous 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 toutes les discussions dans le forum pour vous aider à comprendre ce qui se passe réellement.

6
Gcoop

lostInTransit, 

J'ai 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ère également de télécharger l’exemple URLCache à partir du site Web du développeur Apple:

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

Et voici un autre post sur le problème:

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

J'aimerais que vous partagiez également vos découvertes.

6
magma

Pour ceux qui sont intéressés et sont paresseux comme moi, je voudrais suggérer une implémentation open source (licence MIT) du réseau caché/en cache des images UIImageView: SDWebImage

4
jbat100

Le chargement différé est comme une demande de type synchrone .. signifie attendre pour répondre

bouton image de l'ego est une solution pour cela ..

le bouton d'image de l'ego est une demande de type asynchrone, n'attendez pas la réponse, ajustez simplement l'affichage des données à la fois.

vous pouvez télécharger le dossier de github ....

ajouter à votre projet ...

dans l'image xib..at, change de classe en bouton d'image ego ...

en faire un objet dans le fichier m ...

vous pouvez utiliser..... 

3
Divine_Code

UITableView avec la mise en cache des images et le redimensionnement/réglage en arrière-plan:

http://blog.slaunchaman.com/2011/08/12/gcd-example-updated-now-with-more-speed/

2
Guntis Treulands

Ceci est Tutorial à propos de NSOperation avec un exemple montrant comment charger des images en différé dans UITableViewCell

0
Michal Gumny