Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firestore Swift实时更新文本_Swift_Firebase_Google Cloud Firestore_Swiftui - Fatal编程技术网

Firestore Swift实时更新文本

Firestore Swift实时更新文本,swift,firebase,google-cloud-firestore,swiftui,Swift,Firebase,Google Cloud Firestore,Swiftui,我有这种收集信息的方法 struct MainText { var mtext: String var memoji: String } class MainTextModel: ObservableObject { @Published var maintext : MainText! init() { updateData() } func updateData() { let db = Firestore.firestore()

我有这种收集信息的方法

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)
        }
    }
}
}
这样的一种展示方式

@observeobject private var viewModel=MainTextModel()
self.viewModel.maintext.memoji
self.viewModel.maintext.mtext

如何在不重新启动视图的情况下进行联机更新?

您需要添加快照侦听器,而不是使用只获取文档一次且不返回更新的
getDocument

以下是Firestore的文档:

在您的情况下,您需要执行以下操作:

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)
      }
    }

您需要添加快照侦听器,而不是使用只获取文档一次且不返回更新的
getDocument

以下是Firestore的文档:

在您的情况下,您需要执行以下操作:

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)
      }
    }

线路有问题,如果让我。。。类型“[String:Any]”的值没有成员“get”,并且表达式类型不明确,没有更多上下文。抱歉-已编辑以修复该行。请重试
DispatchQueue.main.async
在firebase闭包中不需要;UI调用总是在主线程上完成,而在后台线程上进行联网。不会伤害任何东西,但可以节省一些输入;-)很高兴知道--谢谢。如果让我。。。类型“[String:Any]”的值没有成员“get”,并且表达式类型不明确,没有更多上下文。抱歉-已编辑以修复该行。请重试
DispatchQueue.main.async
在firebase闭包中不需要;UI调用总是在主线程上完成,而在后台线程上进行联网。不会伤害任何东西,但可以节省一些输入;-)很高兴知道,谢谢。