Как мне использовать Firestore для создания динамического c представления с помощью SwiftUI - PullRequest
0 голосов
/ 07 августа 2020

У меня нет цели динамически обновлять экран без перезапуска приложения. Но даже в этом случае я не могу этого сделать. Сначала отображается экран, а затем данные запрашиваются из базы данных. Итак, я вижу пустое представление. Возможно, я не могу полностью понять, как работают потоки, и проблема здесь

Я хочу использовать информацию из Firestore в моем представлении

struct Exercises: View {

@ObservedObject private var viewModel = ExViewModel()

var body: some View {
    VStack {
        ScrollView{
            ForEach(viewModel.exData) { exData in
                if exData.isShow {
                    NavigationLink(destination: CarouselView(navBarTitle: exData.name, data: exData.cards, dataIds: exData.cardsId)) {
                        ButtonView(title: exData.name)
                    }
                }
            }
        }
        AdBannerView()
    }
    .navigationBarTitle("Упражнения")
    .onAppear(){
        self.viewModel.fetchData()
        
    }
}
}

А вот как я получаю свои данные

class ExViewModel: ObservableObject{
@Published var exData = [ExercisesData]()

private var db = Firestore.firestore()

func fetchData() {
    let rootCollection = db.collection("exercises")

    var ex : [ExercisesData] = []
    
    
    rootCollection.getDocuments() { (querySnapshot, err) in
        
        if let err = err {
            print("Error getting documents: \(err)")
        } else {
            for document in querySnapshot!.documents {
                print("\(document.documentID) => \(document.data())")
            
                let name = document.data()["name"] as? String ?? ""
                let isShow = document.data()["isShow"] as? Bool ?? false
                let cardsId = document.data()["cardsId"] as? [String] ?? []
                                    
                ex.append(ExercisesData(id: document.documentID, name: name, isShow: isShow, cardsId: cardsId))
                
            }  
        }
        self.exData = ex
    }
}
}

Ответы [ 2 ]

0 голосов
/ 05 сентября 2020

Нет проблем с init () или потоками. Я не знаю, что мне нужно добавлять этот объект в SceneDelegate. Итак, мне просто нужно добавить .environmentObject (ExViewModel ()) к моему основному виду

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

    if let windowScene = scene as? UIWindowScene {
        let window = UIWindow(windowScene: windowScene)
        window.rootViewController = UIHostingController(rootView: MotherView().environmentObject(ExViewModel()))
        self.window = window
        window.makeKeyAndVisible()
    }
}
0 голосов
/ 03 сентября 2020

В этом классе вообще нет init(), поэтому функция fetchData() на самом деле не вызывается.

Попробуйте добавить

init() {
    self.fetchData()
}
...