ios - 如何从字典中检索 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
}
}
}
解决方案
我认为这只是您程序的流程。每次遍历集合时,都会将它获得的内容添加到字典中。所以在第一次通过时,它将打印字典有 1 个项目。在第二遍中,它向字典中添加了另一个项目,然后打印字典,其中现在有 2 个项目,因此打印了 2 个项目。我认为您没有看到意外行为,这只是您如何根据循环方式对日志语句进行排序。
换句话说,这样打印是有道理的。
推荐阅读
- java - 如何断言条件最终满足?
- node.js - 为什么我不能在 Mongo 管道匹配中使用 $nin、$exists 等?
- python - API Get 方法以 JSON 格式获取主题标签计数大于 MongoDB 中的所有推文
- javascript - 为 object.value 填充以返回真实的断言
- excel - 如果语句仅在选择在特定列内时执行操作
- sql - Oracle 没有从比较到日期的结果
- terraform - 处理 Terraform AMI 看起来返回一个空列表
- r - 根据数据框中不同行的变量值在 R 中创建新变量
- autodesk-forge - Forge API “Urn 格式不正确。”
- python - 如何在字符串中累积一系列数字并将它们转换为一个数字?