1

Can someone help me? I want to return an array of all data loaded from the Firestore.

func loadData() {

    var messages : [Message] = []

    baseQuery().getDocuments() { (querySnapshot, error) in
        if let error = error {
            print("Error getting documents : \(error)")

        }
        else {
            for document in querySnapshot!.documents {
                var message : [String : Any]!
                message = document.data()

                let messageID : String = document.documentID
                let sender : String  = message["sender"] as! String
                let subject : String = message["Subject"] as! String
                let content : String = message["content"] as! String
                let timeStamp : Date = message["Date"] as! Date

                messages += [Message(messageID: messageID, sender: sender, subject: subject, content: content, timeStamp: timeStamp)]
            }

        }
    }

}
Mo Abdul-Hameed
  • 6,030
  • 2
  • 23
  • 36
fquint
  • 11
  • 2

1 Answers1

0

I got the answer. I got two answers but I think this one uses less CPU processing and memory.

func loadData(from collectionReference: DataCollectionReference, completion: @escaping ([Message]) -> Void){

    reference(to: collectionReference).addSnapshotListener { (snapshot, error) in
        if let error = error {
            print("Error Retriving data: \(error.localizedDescription)")
            return
        }

        guard let snapshot = snapshot else { return }

        var messages = [Message]()

        for document in snapshot.documents {
            var dictionary = [String : Any]()
            dictionary = document.data()

            if let sender = dictionary["sender"], let content = dictionary["content"], let subject = dictionary["subject"] {
                let message = Message(sender: sender as! String, subject: subject as! String, content: content as! String)
                messages.append(message)
            }
        }
        completion(messages)
    }

}

and on the TableViewController I did it, and it works perfectly:

var messages = [Message]()

override func viewDidLoad() {
    super.viewDidLoad()

    FirestoreService.shared.loadData(from: .messages) { (messages) in
        self.messages = messages
         self.tableView.reloadData()
    }
}
fquint
  • 11
  • 2