Как загрузить данные в представление в SwiftUI с помощью firebase / firestore - PullRequest
1 голос
/ 10 марта 2020

Я пытаюсь загрузить данные в представление SwiftUI, используя Firebase / Firestore. Данные загружаются из базы данных, но не передаются в представление.

Я знаю, что они загружаются, потому что я печатаю их после загрузки.

У меня есть файл HomeView.Swift следующим образом :

import SwiftUI
import Firebase

struct HomeView: View {
    let data = GetIphonesData()
    var body: some View {
        NavigationView {
            if (data.data.count == 0) {
                Loader()
                .navigationBarTitle("Loading", displayMode: .inline)
            } else {
                List() {
                    Section(header: Text("iPhone")) {
                        ForEach(data.data , id: \.id) { iphone in
                            ProductNavigationLinkView(model: iphone)
                        }
                    }
                }.listStyle(GroupedListStyle())
                .navigationBarTitle("Home", displayMode: .inline)
            }
        }
    }
}

И у меня есть класс GetIphoneData.Swift следующим образом:

import Foundation
import Firebase
import Combine

class GetIphonesData : ObservableObject {
    @Published var data = [Iphone]()

    init() {
        let db = Firestore.firestore()

        db.collection("iphones").addSnapshotListener { (snap, err) in
            if err != nil {
                print((err?.localizedDescription)!)
                return
            } else {
                print("no errors")
                for i in snap!.documentChanges {
                    let id = i.document.documentID
                    let name = i.document.get("name") as! String

                    self.data.append(Iphone(id: id,
                                            name: name))
                }
                print(self.data)
            }
        }
    }
}

1 Ответ

0 голосов
/ 10 марта 2020
  1. SwiftUI обновляет содержимое своего представления в главном потоке. Оберните закрывающее содержимое addSnapshotListener в Dispatch.main.asyn c.
db.collection("iphones").addSnapshotListener { (snap, err) in
  DispatchQueue.main.async {
    if err != nil {
        print((err?.localizedDescription)!)
        return
    } else {
        print("no errors")
        for i in snap!.documentChanges {
            let id = i.document.documentID
            let name = i.document.get("name") as! String

            self.data.append(Iphone(id: id,
                                    name: name))
        }
        print(self.data)
    }
  }
}
Также ваш let data = GetIphonesData() должен иметь @ObservedObject упаковщик свойств:
struct HomeView: View {
    @ObservedObject var data = GetIphonesData()
    // ...
Пожалуйста, см. этот ответ как ссылку на использование @ObservedObject и @Published
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...