Firestore Swift update text realtime

I have this way of collecting information.

struct MainText {
    var mtext: String
    var memoji: String
}

class MainTextModel: ObservableObject {
    @Published var maintext : MainText!

init() {
    updateData()
}

func updateData() {
    let db = Firestore.firestore()
    
    db.collection("maintext").document("Main").getDocument { (snap, err) in
        
        if err != nil{
            print((err?.localizedDescription)!)
            return
        }
        let memoji = snap?.get("memoji") as! String
        let mtext = snap?.get("mtext") as! String
        
        DispatchQueue.main.async {
            self.maintext = MainText(mtext: mtext, memoji: memoji)
        }
    }
}
}

And such a way of displaying.

@ObservedObject private var viewModel = MainTextModel()

self.viewModel.maintext.memoji

self.viewModel.maintext.mtext

How can I update online without rebooting the view?

Upvotes: 0

Views: 147

Answers (1)

jnpdx
jnpdx

Reputation: 52625

Instead of using getDocument, which only gets the document once and doesn't return updates, you'll want to add a snapshot listener.

Here's the Firestore documentation for that: https://firebase.google.com/docs/firestore/query-data/listen

In your case, you'll want to do something like:

db.collection("maintext").document("Main")
    .addSnapshotListener { documentSnapshot, error in
      guard let document = documentSnapshot else {
        print("Error fetching document: \(error!)")
        return
      }
      guard let data = document.data() else {
        print("Document data was empty.")
        return
      }
      if let memoji = data["memoji"] as? String, let mtext = data["mtext"] as? String  {
            self.maintext = MainText(mtext: mtext, memoji: memoji)
      }
    }

Upvotes: 2

Related Questions