Записи из текстового поля не добавляются в список - PullRequest
0 голосов
/ 04 апреля 2020
import SwiftUI
import Firebase
import FirebaseFirestore

struct ContentView: View {
    var body: some View {
        customView()
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

 struct customView : View{
    @State var msg = ""
    @ObservedObject var datas = observer()
    var body : some View{

        VStack{

            List{
                ForEach(datas.data){i in

                    Text(i.msg)
                }
                .onDelete { (index) in
                    let id = self.datas.data[index.first!].id
                    let db = Firestore.firestore().collection("msgs")
                    db.document(id).delete{(err) in

                        if err != nil{
                            print((err!.localizedDescription))
                            return
                        }
                        print("deleted Successfully !!!")
                        self.datas.data.remove(atOffsets: index)
                    }
                }

            }
            HStack{
                TextField("msg", text: $msg).textFieldStyle(RoundedBorderTextFieldStyle())
                Button(action: {

                    print(self.msg)
                    self.addData(msg1: self.msg)
                }) {
                    Text("Add")
                }.padding()
            }.padding()
        }
    }

 func addData(msg1:String){ 'Here is the code for additon'
        let db = Firestore.firestore()
        let msg =  db.collection("msgs").document()



        msg.setData(["id":msg.documentID,"msg": msg1]) { (err) in
            if err != nil{
                print((err?.localizedDescription)!)
                return
            }
            print("Success")
            self.msg = ""
        }
    }
 }

 class observer : ObservableObject{

    @Published var data = [datatype]()

    init() {

        let db = Firestore.firestore().collection("msg")

        db.addSnapshotListener{(snap, err) in

            if err != nil{

                print((err?.localizedDescription)!)
                return
            }
            for i in snap!.documentChanges{

                if i.type == .added{
                    let msgData = datatype(id: i.document.documentID, msg: i.document.get("msg")
                    as! String)

                    self.data.append(msgData)


                 }
            }
    }
    }

 }

 struct  datatype : Identifiable {
    var id : String
    var msg : String
 }

Вот код для CRUD (создание, чтение, обновление, удаление) с использованием облачной службы Firebase. Когда я ввожу текст в текстовое поле, а затем нажимаю кнопку, он добавляется в базу данных Firebase, но не отображается в интерфейсе в списке приложения. Кто-нибудь может сказать мне, где я иду не так? В этом я пытаюсь добавить данные в firebase, удалить их, прочитать и изменить / обновить. Но введенные данные не отображаются в интерфейсе.

1 Ответ

0 голосов
/ 05 апреля 2020

Попробуйте явно обновить контейнер data в главном потоке, как показано ниже

if i.type == .added{
    let msgData = datatype(id: i.document.documentID, msg: i.document.get("msg")
    as! String)

    DispatchQueue.main.async {
       self.data.append(msgData)
    }
}

, в качестве альтернативного назначения попытки вместо модификации (однако это не должно иметь место)

DispatchQueue.main.async {
   self.data = self.data + [msgData]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...