2017-02-13 1 views
3

Dans mon application, je veux montrer les gifs de giphy. Le fetching et everyting n'est pas un problème, mais je ne sais pas quelle est la meilleure façon d'afficher par exemple tous les gifs tendance. J'ai un CollectionView qui devrait afficher tous les gifs avec ce code:affichant beaucoup de gifs dans la collectionview

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: GifChooserCell.cellIdentifier, for: indexPath) as! GifChooserCell 

     let data = try! Data(contentsOf: gif.giphyURL) 
     let image = FLAnimatedImage(animatedGIFData: data) 
     cell.image.animatedImage = image 


    return cell 
    } 

Le problème est que cette charge tout en RAM et l'application est extrêmement lente. Quelle est la meilleure façon de faire cela? Async? Chargement paresseux?

+1

Je pense que vous pouvez jeter un oeil à: http://stackoverflow.com/a/26401392/2894160 –

Répondre

2

J'ai rencontré le même problème avec AImage qui charge également des fichiers APNG. Ce que j'ai trouvé, c'est que tous ces frameworks Gif et APNG utilisent des CADisplayLinks séparés pour leur tir. Dans mon cas, l'utilisation du processeur était d'environ 7% par cellule et augmentait linéairement avec le nombre de cellules.

Lorsque j'ai désactivé les objets CADisplayLinks, l'utilisation de mon processeur était d'environ 3% après le chargement.

Pour une solution, je pense à arrêter toute animation une fois que le défilement commence, ou éventuellement en utilisant un singleton pour piloter tous mes fichiers APNG.

Espérons que cela aide.


MISE À JOUR:

je suis allé de l'avant et converti tous mes fichiers APNG aux éléments MSSticker en enregistrant d'abord les fichiers APNG sur le disque, puis la création d'un tableau d'autocollants.

En utilisant des autocollants, l'utilisation de mon processeur est de 5% et la mémoire est de 60 Mo pour 7 fichiers APNG. Ma méthode originale d'utiliser un AImageView pour conduire chaque APNG obtient environ 40% d'utilisation du processeur.