Google cloud firestore DispatchQUE获取firestore数据,但不';t填充阵列

Google cloud firestore DispatchQUE获取firestore数据,但不';t填充阵列,google-cloud-firestore,swiftui,swiftui-navigationlink,Google Cloud Firestore,Swiftui,Swiftui Navigationlink,这是我的第一个SwiftUI应用程序。我一直在阅读开发者信息和教程,但是我找不到我想要做的事情 这是一个图书馆应用程序,可以通过两种方式访问图书信息 搜索字段->尚未搜索 描述书的特点 我正在使用Firestore文档处理第二个 我可以获得第一个列表(作者),并保存选定的作者。当我试图使用firestorm文档访问第二个描述列表(类型)时,问题就开始了。 DispatchQueue无法正常工作,因为它可以获取文档信息,但无法填充数组,因此始终发送空数组[]。如果我创建了数组genreItems并

这是我的第一个SwiftUI应用程序。我一直在阅读开发者信息和教程,但是我找不到我想要做的事情

这是一个图书馆应用程序,可以通过两种方式访问图书信息

  • 搜索字段->尚未搜索
  • 描述书的特点
  • 我正在使用Firestore文档处理第二个

    我可以获得第一个列表(作者),并保存选定的作者。当我试图使用firestorm文档访问第二个描述列表(类型)时,问题就开始了。 DispatchQueue无法正常工作,因为它可以获取文档信息,但无法填充数组,因此始终发送空数组[]。如果我创建了数组genreItems并忽略了查询,那么类型列表就完美了。此外,如果我使用自动选择,firestore查询不会得到响应

    我不确定我的发展方式,也许有一个简单的方法。 希望我解释正确

    这是数据库模型

    import Foundation
    
    struct DataBookModel: Hashable, Codable, Identifiable {
    
        var id : Int
        var dataBookModelString : String
        
    }
    
    用于选择作者的第一个列表为Array->

    import Foundation
    import SwiftUI
    
    var AuthorsItems = [
    
        DataBookModel(id: 1, dataBookModelString: "Stephen King"),
        DataBookModel(id: 2, dataBookModelString: "Isaac Asimov"),
        DataBookModel(id: 3, dataBookModelString: "Michael Cripton"),
        DataBookModel(id: 4, dataBookModelString: "Anne Rice")
        
        ]
    
    列表行

    import Foundation
    import SwiftUI
    
    struct ItemsRow: View {
        
        var dataBookModel : DataBookModel
        
        var body: some View {
            Text(dataBookModel.dataBookModelString)
        }
    }
    
    作者

    import Foundation
    import SwiftUI
    
    struct AuthorsList: View {
        
        var body: some View {
            VStack{
                Text("Selecy author")
                List(AuthorsItems){
                    item in
                    NavigationLink(destination: GenreList(dataBookModel: item)){
                        ItemsRow(dataBookModel: item)
                    }
                }
            }
        }
    }
    
    第二个列表->GenreList

    import Foundation
    import SwiftUI
    import FirebaseFirestore
    import FirebaseFirestoreSwift
    import Combine
    
    struct GenreList : View {
        
        var dataBookModel : DataBookModel
        
        @ObservedObject var genreItems = GenreItems()
        
        func saveAuthor() {
            let selectedAuthor = String(dataBookModel.dataBookModelString)
            if !selectedAuthor.isEmpty {
                UserDefaults.standard.set(selectedAuthor, forKey: "selectedAuthor")
                print("saved author: \(selectedAuthor)")
            } else {
                print("error: no author selected")
            }
        }
        
        var body: some View {
            VStack {
                Text("Select Genre")
                
                List(self.genreItems.genreItems) {
                    item in
                    ItemsRow(dataBookModel: item)
                }
                
            }.onAppear(){
                print("genreList: \(self.genreItems.genreItems)")
                
                self.saveAuthor()
                
            }
        }
    }
    
    import Foundation
    import SwiftUI
    import FirebaseFirestore
    import Combine
    
    class GenreItems: ObservableObject {
        
        @Published var genreItems = [DataBookModel]()
        
        init() {
            
            print("memoria: \(self.genreItems)")
        /*
            genreItems = [
                DataBookModel(id: 1, dataBookModelString: "Science fiction"),
                DataBookModel(id: 2, dataBookModelString: "Comedy"),
                DataBookModel(id: 3, dataBookModelString: "Terror")
            ]
           */
            let selectedAuthor = UserDefaults.standard.value(forKey: "selectedAuthor")
            print("saved author GenreItems: \(selectedAuthor)")
            
            var db : Firestore!
            db = Firestore.firestore()
            
            db.collection("genres")
                //.whereField("author", isEqualTo: selectedAuthor!)
                .getDocuments(){
                    (querySnapshot, error) in
                    if let error = error {
                        print("Error en documentos: \(error.localizedDescription)")
                    } else {
                        var i = 0
                        for document in querySnapshot!.documents {
                            let valor = document.data()
                            print("búsqueda: \(valor)")
                            let genre = document.get("genre") as? String ?? "sin genre"
                            i += 1
                            let id = i
                            
                            DispatchQueue.main.async {
                                let registro = DataBookModel(id: i, dataBookModelString: genre)
                                print("registro: \(registro)")
                                self.genreItems.append(registro)
                                print("genreItems: \(self.genreItems)")
                            }
                        }
                        print("result: \(self.genreItems)")
                    }
                    
            }
            
            
        }
    }
    
    流派项目创建->流派列表

    import Foundation
    import SwiftUI
    import FirebaseFirestore
    import FirebaseFirestoreSwift
    import Combine
    
    struct GenreList : View {
        
        var dataBookModel : DataBookModel
        
        @ObservedObject var genreItems = GenreItems()
        
        func saveAuthor() {
            let selectedAuthor = String(dataBookModel.dataBookModelString)
            if !selectedAuthor.isEmpty {
                UserDefaults.standard.set(selectedAuthor, forKey: "selectedAuthor")
                print("saved author: \(selectedAuthor)")
            } else {
                print("error: no author selected")
            }
        }
        
        var body: some View {
            VStack {
                Text("Select Genre")
                
                List(self.genreItems.genreItems) {
                    item in
                    ItemsRow(dataBookModel: item)
                }
                
            }.onAppear(){
                print("genreList: \(self.genreItems.genreItems)")
                
                self.saveAuthor()
                
            }
        }
    }
    
    import Foundation
    import SwiftUI
    import FirebaseFirestore
    import Combine
    
    class GenreItems: ObservableObject {
        
        @Published var genreItems = [DataBookModel]()
        
        init() {
            
            print("memoria: \(self.genreItems)")
        /*
            genreItems = [
                DataBookModel(id: 1, dataBookModelString: "Science fiction"),
                DataBookModel(id: 2, dataBookModelString: "Comedy"),
                DataBookModel(id: 3, dataBookModelString: "Terror")
            ]
           */
            let selectedAuthor = UserDefaults.standard.value(forKey: "selectedAuthor")
            print("saved author GenreItems: \(selectedAuthor)")
            
            var db : Firestore!
            db = Firestore.firestore()
            
            db.collection("genres")
                //.whereField("author", isEqualTo: selectedAuthor!)
                .getDocuments(){
                    (querySnapshot, error) in
                    if let error = error {
                        print("Error en documentos: \(error.localizedDescription)")
                    } else {
                        var i = 0
                        for document in querySnapshot!.documents {
                            let valor = document.data()
                            print("búsqueda: \(valor)")
                            let genre = document.get("genre") as? String ?? "sin genre"
                            i += 1
                            let id = i
                            
                            DispatchQueue.main.async {
                                let registro = DataBookModel(id: i, dataBookModelString: genre)
                                print("registro: \(registro)")
                                self.genreItems.append(registro)
                                print("genreItems: \(self.genreItems)")
                            }
                        }
                        print("result: \(self.genreItems)")
                    }
                    
            }
            
            
        }
    }