10
votes

Quelle est la meilleure approche de la mise en cache d'image asynchrone sur l'iPhone?

Je crée une application iPhone qui extraire des données à partir d'une API Web, y compris les adresses électroniques. J'aimerais afficher une image associée à chaque adresse e-mail dans les cellules du tableau, donc je cherche le carnet d'adresses des images et la retouche sur une valeur par défaut si l'adresse e-mail n'est pas dans le livre. Cela fonctionne bien, mais j'ai quelques préoccupations:


0 commentaires

4 Réponses :


2
votes

J'utiliserais la dernière méthode que vous avez répertorie (recherche de cellules de table asynchrones), mais il suffit d'apparaître que des images pour les enregistrements actuels sont affichés. J'ai surchargé les méthodes UiscrollviewDelegate pour savoir quand un utilisateur a cessé de défiler, puis commencez à faire des demandes pour les cellules visibles actuelles.

Quelque chose comme ça (ceci est légèrement modifié d'un tutoriel que j'ai trouvé sur le Web que je ne trouve pas maintenant, mes excuses de ne pas citer l'auteur): xxx

Une fois que vous savez quels enregistrements d'adresse sont actuellement visibles, il suffit de rechercher ces (5 -7 enregistrements probablement) sera rapide. Une fois que vous avez saisi l'image, il suffit de le mettre en cache dans un dictionnaire afin de ne pas avoir à redonner la demande de l'image ultérieurement.


3 commentaires

Juste hors de curiosité, pourquoi ce code d'échantillon conserve-t-il le Nsarray des cellules, puis chaque adresseRecordTablecell avant de travailler avec eux puis de les libérer, dans LoadContentForVisiblecells ? Je ne vois pas ce qui pourrait les amener à devenir distribuée lors de l'exécution de cette méthode.


Vous avez raison. Il n'a pas besoin d'être retenu. J'ai écrit ce code de retour quand je voudrais apprendre de cacao, il y a donc des noob-ness dedans :)


Bon à savoir sur Uiscrollviewelegate . C'est ce que le EXEMPLE liée par Yonel ci-dessous utilise aussi. . La chose amusante est que Tweetie 2 ne semble pas utiliser cette approche. Lorsque je fais défiler vite, je peux voir des images en cours de chargement lorsqu'il fait défiler. Il m'a toujours énervé que les applications Apple ne chargent pas les images lors du défilement et Tweetie 2 semble montrer que ce n'est pas nécessaire.



1
votes

Vous semblez essayer d'implémenter des images paresseuses en charge dans UitailView. Il y a un bon exemple d'Apple, je le référencis ici: Images de charge paresseuse dans UitailView


1 commentaires

Merci beaucoup pour le lien avec le LazyTableImages exemple. Je n'étais pas au courant, et heureux de l'avoir à étudier.



2
votes

Quelle que soit la stratégie que vous utilisez pour la mise en cache effective des images, je ne ferais qu'un passage dans les données du carnet d'adresses chaque fois que vous obtenez un lot d'adresses électroniques, si possible. (Et oui, je ferais cela asynchrone.)

Créer un NSMutableddiction qui servira de cache en mémoire pour les résultats de recherche. Initialisez ce dictionnaire avec chaque adresse e-mail à partir du téléchargement en tant que clé, avec une sentinelle comme valeur de cette clé (telle que [nsnull Null] ).

Suivant, itérer à travers chaque Abrecordref dans le carnet d'adresses, appelant Abecordcopyvalue (enregistrement, kabpersonemailProperty) et en boucle dans les résultats de chaque abrutiste renvoyée. Si l'une des adresses e-mail est des clés dans votre cache, définissez [Numéro de nsnumberwithint: ABRecordGETRecordID (enregistrement)] comme valeur de cette touche de votre dictionnaire.

Utilisation de ce dictionnaire En tant qu'index de recherche, vous pouvez obtenir rapidement les images de AbrecordRefs pour uniquement les adresses électroniques que vous affichez actuellement dans la vue de votre table compte tenu de la position de défilement actuelle de l'utilisateur, comme suggéré dans la réponse de Hoopjones. Vous pouvez ajouter un lecteur de carnet d'adresses pour invalider votre cache, déclencher une autre opération d'indexation, puis mettez à jour la vue, si votre application a besoin de ce niveau de «à jour».


2 commentaires

Merci. Donc, le tarif que j'ai réellement mis en œuvre une solution qui recueille une adresse à la fois, mais elle crée une vignette et l'enregistre dans le répertoire de documents Sandbox. Et oui, il suffit de rechercher uniquement les images dans le carnet d'adresses la première fois qu'ils doivent être affichés. Je pense Chargement de l'image mise en cache du bac à sable devrait être suffisamment rapide qu'il n'a pas besoin d'être asynchronisé. Je n'ai pas besoin du niveau de tablat-temps que vous décrivez, alors ensuite, je vais voir comment planifier des mises à jour régulières des vignettes en cache - et oui, je serai itération à travers le carnet d'adresses une seule fois pour tous.


Juste curieux, comment pouvez-vous rechercher une adresse à la fois, mais seulement itérer à travers le carnet d'adresses une fois?



0
votes

FYI, j'ai publié une bibliothèque gratuite, puissante et facile pour faire des images asynchrones de chargement et de mise en cache de fichiers rapides: objets gérés HJ http://www.markj.net/asynchrone-loading-caching- Images-iPhone-Hjobjman /


0 commentaires