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

问题描述 投票:0回答:1

我已经坚持了几天,但我不确定如何继续。这是我第一次使用云数据库,在这里我需要一些指导,因为我对编程(尤其是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
ios swift firebase google-cloud-firestore tableview
1个回答
0
投票

我会尝试将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()
                }
            }
        }
© www.soinside.com 2019 - 2024. All rights reserved.