Je suis nouveau dans Swift et ma question pourrait être idiote pour la plupart d'entre vous. Mais de toute façon j'essaye d'apprendre en faisant. Voici mon problème. j'ai un modèle:

import Foundation
import Firebase

struct special {
    let name: String
    let position: Int
    let imageURL: String?
}


class SpecialList {
    
    var specialList: [special] = []

    init() {        
        
    }
    
    func loadSpecial () {
        db.collection("special").getDocuments { (querySnapshot, error) in
            if let e = error {
                print("Error\(e)")
            } else {
                if let snapshotDocuments = querySnapshot?.documents {
                    for doc in snapshotDocuments {
                        let data = doc.data()
                        if let name = data["name"] as? String, let position = data["position"] as? Int, let imageURL = data["imageURL"] as? String {
                            let newList = special(name: name, position: position, imageURL: imageURL)
                            self.specialList.append(newList)
                        }
                    }
                }
            }
        }
    }    
}

Et j'essaye d'implémenter cela dans ViewController:

var specialList = SpecialList()

override func viewDidLoad() {
specialList.loadSpecial()
print(specialList.specialList)
}

En fait, ce dont j'ai besoin, ce sont les données récupérées de Firebase. J'essaye de l'enregistrer dans var specialList: [special] = [] mais il est toujours vide. Je pense que je devrais faire quelque chose dans init () mais je n'ai pas trouvé le moyen de le faire correctement.

P.S. le chargement depuis Firebase fonctionne bien. Vérifié avec l'impression des données.

Et les données doivent être dans collectionView

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return specialList.specialList.count
    }
    
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "SpecialCell", for: indexPath as IndexPath) as! SpecialCollectionViewCell
        
        if let imageURL = specialList.specialList[indexPath.row].imageURL {
            let url = URL(string: imageURL)
            cell.specialPic.kf.setImage(with: url) // download foto
        }
        cell.specialName.text = specialList.specialList[indexPath.row].name
        return cell
    }
0
Aslan Azdaev 26 août 2020 à 14:18

3 réponses

Meilleure réponse
func loadSpecial (completion: @escaping (Bool) -> Void) {
    db.collection("special").getDocuments { (querySnapshot, error) in
        if let e = error {
            print("Error\(e)")
            completion(false)
        } else {
            if let snapshotDocuments = querySnapshot?.documents {
                for doc in snapshotDocuments {
                    let data = doc.data()
                    if let name = data["name"] as? String, let position = data["position"] as? Int, let imageURL = data["imageURL"] as? String {
                        let newList = special(name: name, position: position, imageURL: imageURL)
                        self.specialList.append(newList)
                    }
                }
                completion(true)
            }
            completion(false)
        }
    }
}

Ajouter la complétion à votre méthode

Et dans VC faire:

override func viewDidLoad() {
    super.viewDidLoad()
    specialList.loadSpecial(completion: { [weak self] success in
        self.collectionView.reloadData()
    })
}

Si la réalisation de la collection est correcte, vous le verrez

1
Kstin 26 août 2020 à 13:59

Si quelqu'un a le même problème. La meilleure façon de le résoudre en utilisant Delegate. j'ai ajouté un supplément:

protocol SpecialListUpdateDelegate {
    func didUpdate(sender: SpecialList)
}

Dans ma classe Spécialiste:

var delegate: SpecialListUpdateDelegate?

Dans loadspecial ():

self.delegate?.didUpdate(sender: self)

Dans le protocole d'ajout de VC pour VC: SpecialListUpdateDelegate

Dans viewDidLoad:

specialList.delegate = self

Et la dernière fonction de mise en œuvre:

func didUpdate(sender: SpecialList) {
        DispatchQueue.main.async {
            self.collectionView.reloadData()
        }
    }
0
Aslan Azdaev 28 août 2020 à 12:25

Mettez un point d'arrêt dans votre instruction append et instruction print et voyez laquelle est appelée en premier. L'instruction print peut être appelée avant d'obtenir les données.

1
Shreeja 26 août 2020 à 11:32