在iOS中使用Firebase / Firestore填充tableView时遇到麻烦

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在iOS中使用Firebase / Firestore填充tableView时遇到麻烦相关的知识,希望对你有一定的参考价值。

我已经坚持了几天,但我不确定如何继续。这是我第一次使用云数据库,在这里我需要一些指导,因为我对编程(尤其是Firestore)还比较陌生。

基本上,我试图将我的所有文档数据都存储在get()中,并将其存储在字典中,以便以后可以在viewDidLoad方法中使用它来填充tableView dataSource节和行。

我正在健身房/锻炼日志应用程序上工作,并且为“天数和锻炼集合”输入了一些虚拟数据,因此我的字典像这样打印出来...

tableView

但是我在使用此数据填充字段时遇到了麻烦,因为如果我尝试在dateWorkoutRequest函数外部(例如在dataSource方法内部)打印出dataDict的结果,则会得到一个空字典。我的dataDict = ["Monday": ["Chest", "Arms"], "Wednsday": ["Legs", "Arms"], "Tuesday": ["Back"]] 放在错误的位置了吗?我应该使用字典来解析我的数据还是一个坏主意?

感谢您能提供的任何帮助。在此先感谢!

这是我的数据结构和相关代码...

tableView.reloadData()

/users/mi9P3TrLwkQejYo3oDIu/Days/WZ3Q6LDuu1kja5Rc/Workouts/BpLGFREoJNzNQW

enter image description here

enter image description here
答案

我会尝试将self.tableView.reloadData()放在将文档附加到数组中的行之后。

[我认为将DispatchQueue.main.async块也放入reloadData中也很有趣。

喜欢这个:

    var daysArray = [String]()
    var dayIdArray = [String]()
    var dataDict : [String:[String]] = [:]

    //MARK: - viewDidLoad()
        override func viewDidLoad() 
            super.viewDidLoad()

            vcBackgroundImg()
            navConAcc()

            picker.delegate = self
            picker.dataSource = self

            tableView.register(UITableViewCell.self, forCellReuseIdentifier: cellID)
            tableView.tableFooterView = UIView()

            Auth.auth().addStateDidChangeListener  (auth, user) in
                self.userIdRef = user!.uid
                self.colRef = Firestore.firestore().collection("/users/\(self.userIdRef)/Days")

                self.dateWorkoutRequest()
            

        

        func dateWorkoutRequest()
            self.colRef.getDocuments  (snapshot, err) in
                if let err = err
                
                    print("Error getting documents: \(err)");
                
                else 
                    //Appending all Days collection documents with a field of "dow" to daysarray...
                    for dayDocument in snapshot!.documents 
                        self.daysArray.append(dayDocument.data()["dow"] as? String ?? "")
                        self.dayIdArray.append(dayDocument.documentID)

                        Firestore.firestore().collection("/users/\(self.userIdRef)/Days/\(dayDocument.documentID)/Workouts/").getDocuments  (snapshot, err) in
                            if let err = err
                            
                                print("Error getting documents: \(err)");
                            
                            else 
                                //Assigning all Workouts collection documents belonging to selected \(dayDocument.documentID) to dictionary dataDict...
                                for document in snapshot!.documents 

                                    if self.dataDict[dayDocument.data()["dow"] as? String ?? ""] == nil 
                                        self.dataDict[dayDocument.data()["dow"] as? String ?? ""] = [document.data()["workout"] as? String ?? ""]
                                     else 
                                        self.dataDict[dayDocument.data()["dow"] as? String ?? ""]?.append(document.data()["workout"] as? String ?? "")
                                    
                                    print(self.dataDict)
                                
                            
                        
                    
                    self.dayCount =  snapshot?.count ?? 0
                    self.tableView.reloadData()
                
            
        

以上是关于在iOS中使用Firebase / Firestore填充tableView时遇到麻烦的主要内容,如果未能解决你的问题,请参考以下文章

相同的 Flutter Web 构建使用 `dhttp` 在本地运行,但使用 `firebase serve` 或 `firebase deploy` 失败

vue-cli v3 与 node.js firebase 函数,firebase 托管(错误:在函数源目录中找不到 npm 包)

无法使用 Firebase 在 iOS 中接收通知

如何在 iOS 中使用 Firebase 发送通知

无法使用 Firebase 在 iOS 中接收自定义通知

在 iOS 框架中使用 Firebase