【发布时间】:2020-04-29 01:26:22
【问题描述】:
我正在尝试使用我已解析并存储在字典中的 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
}
}
}
【问题讨论】:
-
你试过把
DispatchQueue.main.async {放在if self.dataDict[dayDocument.data()["dow"] as? String ?? ""] == nil {上面吗?仍在处理您的代码,但可能包括在异步调用中存储数据以及reloadData调用。 -
这些行:
picker.delegate = self picker.dataSource = self不引用任何内容,您需要将 tableview 委托设置为具有dataSource与picker的关系如何,只有picker不是您的 tableview ?如果是,它的声明在哪里? -
我真的不认为您应该将数据存储在字典中以用于像这样的 tableview,拥有一个数组更有意义。它更容易概念化,当tableview形成时,它会循环遍历数组并获取数组中的每个插槽,并将其放在一行中。您可以将对象存储在数组中。
-
我知道你在代码中看不到,但我实际上使用的是 UITableViewController,所以我不需要设置委托或数据源,它们是由父级隐式设置的。
标签: ios firebase asynchronous google-cloud-firestore tableview