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: p>
cellules de table strong>: J'ai donc pensé rassembler toutes les adresses e-mail pour lesquelles j'ai besoin de trouver des images et de les trouver à la fois. De cette façon, je voudrais seulement parcourir le livre une seule fois pour toutes les adresses. Mais cela ne fonctionne pas bien pour les cellules de table, où chaque cellule correspond à une seule adresse e-mail. Je devrais soit recueillir toutes les images avant d'afficher toutes les cellules (potentiellement lent), ou si chaque cellule peut rechercher chaque image lors de la charge de son chargement (même plus lente, car je aurais besoin d'itération du livre pour trouver un match pour trouver un match pour trouver un match em> chaque adresse e-mail em>). p> li>
Donc, ma question est la suivante: comment les autres font-ils cela? Je jouais avec Tweetie2, et on dirait que cela met à jour les cellules de table affichées de manière asynchrone. Je suppose qu'il envoie une demande HTTP distincte pour chaque image dont il a besoin. Si oui, j'imagine que la recherche du carnet d'adresses local par adresse électronique n'est pas moins efficace, alors peut-être que c'est la meilleure approche? Il suffit de ne pas vous inquiéter des problèmes de performance associés à la recherche du carnet d'adresses? P>
Si oui, sauve une image miniature dans le bac à sable la meilleure approche de la mise en cache? Et si je voulais créer un nouvel emploi pour mettre à jour toutes les vignettes avec les modifications apportées au carnet d'adresses, c'est une fois par jour, quelle est la meilleure approche pour le faire? P>
Comment le reste de vous résout ce genre de problème? Les suggestions seraient très appréciées! P> NSInvocationOPERATION
. Pour chaque image trouvée dans AdressageBook, je sauvegarderais une vignette dans l'application Sandbox. Ensuite, chaque cellule pourrait simplement faire référence à ce fichier et montrer la valeur par défaut si elle n'existe pas (car ce n'est pas dans le livre ni n'a pas encore été trouvé). Si l'image est trouvée ultérieurement dans la recherche asynchrone, la prochaine fois que l'image doit être affichée, elle apparaîtrait soudainement. Cela pourrait bien fonctionner pour la régénération périodique des images (car lorsque des images ont été modifiées dans le carnet d'adresses, par exemple). Mais alors pour une instance donnée de mon application, une image peut ne pas être réellement apparu pendant un moment. P> li>
nsinvocationOration sur chaque cellule car il est affiché et si l'icône mise en cache est manquante dans le bac à sable. Mais ensuite, nous sommes de retour à l'inefficacement dans l'ensemble du carnet d'adresses de chacun - et cela peut être beaucoup d'entre eux si vous avez simplement téléchargé une bande de nouvelles adresses électroniques. P> LI>
ul>
4 Réponses :
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): p> 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. P> p>
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 code>? 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 Code>
. 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.
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 P>
Merci beaucoup pour le lien avec le LazyTableImages code> exemple. Je n'étais pas au courant, et heureux de l'avoir à étudier.
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.) P>
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 Suivant, itérer à travers chaque Abrecordref dans le carnet d'adresses, appelant 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». P> [nsnull Null] p>). P>
Abecordcopyvalue (enregistrement, kabpersonemailProperty) code> 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)] code> comme valeur de cette touche de votre dictionnaire. P>
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 i> 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?
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 / P>