Je me rends compte qu'il y a déjà beaucoup de ces questions, mais aucun d'entre eux ne semble aborder cette affaire.
La collectionView lit les noms de fichiers à partir de J'imagine que c'est lié à la réutilisation des cellules avec l'attribution d'une image ASYNC, mais comment résoudre ce problème? CollectionView et cellule personnalisée définie dans le storyboard. Les images sont stockées sur le serveur derrière l'authentification de base, de sorte que la plupart des solutions de réutilisation ne s'appliquent pas. P> J'ai essayé de nombreuses modifications, mais aucun d'entre eux ne semble résoudre le problème. Actuellement, l'effet est que les nouvelles cellules apparaissant lors du défilement rapide sont changées plus d'une fois et certaines d'entre elles se retrouvent toujours avec une image erronée, pointant dans une question de réutilisation. P> Merci d'avance pour toute aide et suggestions . p> p> Fichiers CODE> TRAY et chargent des images du répertoire de documents ou les télécharge, affiche et enregistre les documents. Fonctionne parfaitement lisse et sans aucune bibliothèque supplémentaire, mais lors du défilement rapide, plusieurs cellules reçoivent de mauvaises images. Appeler
[collectionView reloaddata] code> avec n'importe quelle action ou défilement recharge ces mauvaises images à des bonnes images à bonnes. P>
3 Réponses :
Vous devez conserver des informations contextuelles quelque part. En d'autres termes, dans votre bloc d'achèvement, vérifiez si la cellule doit vraiment contenir une image téléchargée ou non. Sinon, ne l'attribuez pas. Par exemple URL d'image. Vous pouvez faire cela ... p>
nsurl * imageURL code> à votre objet cellulaire li>
- Avant votre
Downloadfromurl: ... code> Store fileurl code> à imageURL code> Propriété de la cellule LI>
- Dans le bloc d'achèvement, comparez si
fileurl code> correspondent cell.ImageURL code> et s'il correspond à l'image, définissez l'image sinon ne le définit pas li>
- et
nil code> Votre cellule imageURL code> propriété dans Prépareforruse code> Li>
ul>
... ou vous pouvez déplacer votre code de chargement dans votre classe de cellules et attribuer ici une URL de l'image, etc. De nombreuses façons de le faire. P>
Fonctionne génial, merci! J'utilise la propriété Imagename pour cette comparaison et cela résout le problème.
Ou utiliser @rob Way. Et ajoutez ce qu'il suggère (annulation, mise en cache, ...).
@ROBERTVOJTA Je vois que les vérifications d'Afnetworking pour la même URL, tandis que SDwebimage ne
Enregistré ma semaine (une journée et 1/2) frapper la tête contre CocheForitematidExpath retourner nul pour (très) cellules visibles. Je m'attends à ce que cette réponse soit fermée bientôt pour empêcher toute fin, merci ;-)))))))))))))))))))))))))))))))))
Pareil ici. Merci beaucoup!
Le problème est que lors du défilement rapide, la cellule peut être déséquilibrée et réutilisée pour une autre cellule au moment de la fin de la demande asynchrone, à la mise à jour de la mauvaise cellule. Donc, dans votre bloc d'achèvement, vous devez vous assurer que la cellule est toujours visible: Remarque, ce Au fait, le ci-dessus suppose que le Idéalement, une fois que vous avez adressé ce qui précède, il y a quelques optimisations que vous pourriez apporter à ce processus: p> Si la cellule est réutilisée pendant que la requête précédente est toujours en cours d'exécution, vous voudrez peut-être annuler cette demande préalable. Si vous ne le faites pas et que vous faites défiler rapidement, disons, 200 cellules, affichez-vous maintenant, par exemple, les cellules 201 à 221, les demandes de ces 20 cellules actuellement visibles seront en file d'attente et ne s'affichera pas tant que les demandes de 200 demandes précédentes. p>
Pour pouvoir annuler des demandes antérieures, vous ne pouvez pas utiliser Vous devez probablement mettre en cache vos images. Si vos cellules actuellement visibles ont toutes leurs images et que vous les faites défiler, vous sortez, vous semblez les demander à nouveau. Vous devriez d'abord voir si vous avez déjà récupéré l'image, et dans l'affirmative, utilisez-le, et seulement si vous n'en avez pas dans votre cache, réémunérez la demande. P>
Oui, je sais que vous utilisez la version du fichier dans le stockage persistant vers le cache, mais vous pouvez également vouloir mettre en cache à RAM. Généralement, les gens utilisent C'est beaucoup à changer. Si vous voulez de l'aide, faites-nous savoir. Mais beaucoup plus facilement consiste à utiliser la catégorie uicollectionview code> méthode
CELFEFORITEMATINDEXPATH code> ne devrait pas être confondu avec le
uicollectionvievation de la même manière code> Méthode
CollectionView: CORELFORITEMATINDEXPATH: code>. La méthode
uicollectionview code> CORELFORITEMATDEXPATH code> renvoie un
uicollectionviewcell code> Si la cellule est toujours visible et renvoie
nil code> si ce n'est pas le cas. p>
nsindexpath code> de cette cellule ne peut pas changer (c'est-à-dire qu'il n'est pas possible que des lignes supplémentaires auraient pu être insérées au-dessus de cette ligne tandis que l'image était asynchroneusement récupéré). Ce n'est parfois pas une hypothèse valide. Donc, si vous vouliez faire attention, ce que vous devriez vraiment faire, c'est de retourner au modèle et de recalculer ce que le
nsindexpath code> pour cet objet modèle, et utilisez-le pour déterminer le
updateCell Code> Référence. P>
sendasynchronousrequest code>. Vous devez utiliser un
NsurlConnection code> ou
NsurlSessionTask code>, qui sont annulables. P>
li>
nscache code> à cette fin. P>
li>
ol>
uiimageview code> dans SDWebimage ou Afnetworking , qui fait tout cela pour vous. p> p>
Merci, ça marche! Ad 1. J'ai rencontré un problème avec NsurlConnection - je pense que c'était un problème de mise à jour des images cellulaires tout en défilant. AD 2. Je vais y examiner, merci.
@yosh très bien. RE "AD 1", je ne suggérais pas d'utiliser NsurlConnection code> pour répondre à votre question initiale, mais faire une observation totalement indépendante qu'il permettrait des demandes annulables, et si vous annulez les demandes en attente de Les cellules qui ont défilé hors de vue, il améliorera grandement les performances si vous faites défiler vraiment rapidement avec une connexion Internet lente. Désolé si cette observation non sollicitée était une source de confusion!
Inutile de s'excuser. Je crois comprendre que je ne comprends pas comment implémenter NsurlConnection qui satisferait également les fonctionnalités ci-dessus, car j'avais un problème avec cela auparavant.
@yosh Ouais, c'est un peu compliqué. Pas la science de la fusée, mais non triviale, aussi. C'est pourquoi j'ai suggéré la catégorie uiimageview de SDwebimage CODE>, car ils ont fait un bon bon travail avec une mise en œuvre assez élégante. (Je suis un fan Afnetworking, mais la catégorie
UIImageView de SDWebimage CODE> est un peu plus fort que Afnetworking's, IMHO, donc à moins que vous n'utilisez déjà Afnetworking pour d'autres raisons, SDwebimage est probablement la voie à suivre.)
Ça ne marche pas pour moi. J'utilise plutôt quelque chose comme ça si cell.Id == imageURL {} Pour vérifier si la cellule est la même cellule, l'image ASYNC Chargement a commencé.
Vous devez faire référence à la cellule en bloc de remplacement: avec p>