首页 > 解决方案 > 如何从字典中检索 Firestore 数据并填充 Tableview 行/部分?

问题描述

我正在尝试使用我已经解析并存储在字典中的 Firestore 数据填充我的 tableview 的 Sections 和 Rows,看起来像这样......

dataDict = ["Monday": ["Chest", "Arms"], "Wednsday": ["Legs", "Arms"], "Tuesday": ["Back"]]

坦率地说,我什至不确定我是否应该像以前那样将数据存储在字典中。这样做是错的吗?此外,由于数据是异步提取的,我如何才能在字典完全加载我的网络数据后填充我的部分和?我正在使用完成处理程序,但是当我尝试打印结果时dataDict,它会连续打印出三个数组,就像这样......

["Monday": ["Chest", "Arms"]]
["Tuesday": ["Back"], "Monday": ["Chest", "Arms"]]
["Tuesday": ["Back"], "Monday": ["Chest", "Arms"], "Wednsday": ["Legs", "Arms"]]

而我希望它在完成后返回数组的单个打印。我究竟做错了什么?

在此处输入图像描述 在此处输入图像描述

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.loadData { (done) in
            if done {
                print(self.dataDict)
            } else {
                print("Error retrieving data")
            }
        }

    }

}

//MARK: - Load Data
func loadData(completion: @escaping (Bool) -> ()){
        self.colRef.getDocuments { (snapshot, err) in
            if let err = err
            {
                print("Error getting documents: \(err)");
                completion(false)
            }
            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)");
                            completion(false)
                        }
                        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 ?? "")
                                }
                                DispatchQueue.main.async {
                                    self.tableView.reloadData()
                                }
                                // print(self.dataDict)
                            }
                            completion(true)
                        }
                    }
                }
                self.dayCount =  snapshot?.count ?? 0
            }
        }
    }

标签: iosfirebaseasynchronousgoogle-cloud-firestoretableview

解决方案


我认为这只是您程序的流程。每次遍历集合时,都会将它获得的内容添加到字典中。所以在第一次通过时,它将打印字典有 1 个项目。在第二遍中,它向字典中添加了另一个项目,然后打印字典,其中现在有 2 个项目,因此打印了 2 个项目。我认为您没有看到意外行为,这只是您如何根据循环方式对日志语句进行排序。

换句话说,这样打印是有道理的。


推荐阅读