photoLibrary / collectionView Swift UIkit

Bonjour les codeurs je cherche une personne ici pour m’aider sur un sujet que je trouve compliqué ! je dois remplir une collectionView remplir une collectionView avec la libraire photo de l’utilisateur pour une de mes applications.

chose que je n’ai jamais faite j’ai écrit un exemple que ne fonctionne pas donc " j ai écrit de la merde à l’exécution j’obtiens un gros message erreur : "2020-08-14 15:03:25.910432+0200 collectionViewPhoto[841:207231] *** Terminating app due to uncaught exception ‹ NSInternalInconsistencyException ›, reason: ‹ Modifications to the layout engine must not be performed from a background thread after it has been accessed from the main thread. ›

*** First throw call stack:

(0x18791d344 0x187632cc0 0x187e1988c 0x187c1374c 0x187c13664 0x187c132d4 0x18bf04060 0x18be88828 0x18b256920 0x18bf172bc 0x18e568978 0x18e568db8 0x18e57b21c 0x18e4bfe10 0x18e4ea8c4 0x18e4eb8c8 0x18762b0e4 0x187623974 0x187625a64 0x1876257a8 0x18762b9c8)

libc++abi.dylib: terminating with uncaught exception of type NSException." Selon moi j’arrive à télécharger les photo du device, mais ma collectionView ne 'affiche pas. et plante. Si une personne ici à déjà réalisé ce genre de chose je veux bien un coup de main ? pour jeter un regard sur mon code :

https://github.com/philippemichel1/acceslibrairiephotos

je suis preneur de tous exemple et conseil remarque, cours français si possible , car Merci à tous

https://github.com/philippemichel1/acceslibrairiephotos.git

Bonjour @titastus,

c’est difficile de t’aider sans voir le code en question, mais en voyant l’erreur on peut te donner des pistes.
Ton crash vient du fait que tu essaies de modifier l’interface graphique (probablement ta collection view) depuis un thread secondaire (probablement la fin du téléchargement ou un callback système qui serait en arrière plan).
Il faut que depuis ton thread secondaire, tu exécutes le code graphique de cette façon :

DispatchQueue.main.async {
 // code graphique
}

*Vérifie la syntaxe car je l’ai fait de tête mais je crois que ça ressemble à quelque chose comme ça

Dans le cours 2020 sur SwiftUI j’ai fait des vidéos à ce sujet pour expliquer mieux les raisons et solutions pour cette bascule entre les threads. C’est dans le chapitre sur les téléchargement qui va bientôt sortir.

Merci Maxime de tes conseils et merci à tous pour info voici le code :

ViewController.swift

import UIKit
import Photos

class ViewController: UIViewController {

var listePhotos = [PHAsset]()

@IBOutlet weak var vueLibrairiePhoto: UIView!
@IBOutlet weak var librairiePhotos: UICollectionView!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    librairiePhotos.dataSource = self
    librairiePhotos.delegate = self
    populatePhotos()
}

func setupUI() {
    self.navigationController?.navigationBar.prefersLargeTitles = true
}

func populatePhotos() {
    
    PHPhotoLibrary.requestAuthorization { [weak self] status in
        if status == .authorized {
            let assets = PHAsset.fetchAssets(with: PHAssetMediaType.image, options: nil)
            assets.enumerateObjects { (object,_, _) in
                print(object)
                self?.listePhotos.append(object)
                self?.listePhotos.reverse()
                self?.librairiePhotos.reloadData()
            }
        }
    }
}

}
LibrairiePhotosExtention.swift -> extension collectionView
import UIKit
import Photos
extension ViewController: UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

//func numberOfSections(in collectionView: UICollectionView) -> Int {
    //return 1
//}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return listePhotos.count
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as? CellulePeso {
        
        let asset = self.listePhotos[indexPath.row]
        let manager = PHImageManager.default()
        
        manager.requestImage(for: asset, targetSize: CGSize(width: 65, height: 65), contentMode: .aspectFill, options: nil) { (image, _) in
            DispatchQueue.main.async {
                cell.Photos.image = image
            }
        }
        return cell
    }
    return UICollectionViewCell()
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let width = collectionView.frame.width / 3 - 1
    return CGSize(width: width, height: width)
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
    return 1.0
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
    return 1.0
}

}

CellulePeso.swift -> itemPersonalisée avec une image
import UIKit

class CellulePeso: UICollectionViewCell {

@IBOutlet weak var** Photos: UIImageView!

}

}