0

J'ai un UICollectionView où je charge la collection de photos de la photothèque.Meilleure façon de recharger UICollectionView

for asset: PHAsset in self.photoAssets! { 
          SFSImageManger.imageFromAsset(asset, isOriginal: false, toSize: CGSize(width: 150, height: 150), resultHandler: { (image: UIImage?) in 
           guard image != nil else { return } 
           dispatch_async(dispatch_get_main_queue(), { 
            self.photos.append(image!) 
            self.albumCollection.reloadData() 
           }) 
          }) 
         } 

Voici comment je charge des photos. Le problème est que lorsque j'ai de nombreuses photos, disons plus de 500, la collection scintille lorsque je défile et que la sélection collection ne fonctionne pas tant que la boucle for n'est pas terminée.

Je ne souhaite pas que l'application affiche la progression du chargement et gèle également l'interface utilisateur. Alors, comment puis-je augmenter les performances dans ce cas?

Répondre

1

Ce que je voudrais faire est de créer un didSet dans votre tableau de photos comme ceci:

var photos = [UIImages]() { 
    didSet { 
     albumCollection.reloadData() 
    { 
} 

Et je suppose que votre boucle est en fonction, dans ce cas, je voudrais créer un tableau temporaire et initialiser avec le tableau de photos, ajoutez les images au tableau temporaire et, après la boucle, assignez le tableau temporaire au tableau des photos d'origine. Quelque chose comme ceci est mon idée:

var tempPhotos = photos 
    for asset: PHAsset in self.photoAssets! { 
          SFSImageManger.imageFromAsset(asset, isOriginal: false, toSize: CGSize(width: 150, height: 150), resultHandler: { (image: UIImage?) in 
           guard image != nil else { return } 
           dispatch_async(dispatch_get_main_queue(), { 
            self.tempPhotos.append(image!) 
           }) 
          }) 
         } 
    photos = tempPhotos 

De cette façon, la CollectionView ne mettra à jour une fois. Salutations Jorge Paravicini.

0

En ce qui concerne la génération de l'image à partir de l'actif dans la méthode cellForRow et pendant que l'image génère un espace réservé show ou simplement un fond gris à la place de l'image dans la cellule.

0

Vous ne devez pas recharger la vue de collection complète. Utilisez plutôt des mises à jour incrémentielles avec insertItems().