我是swift和firebase服务的新手, 我正在使用fire store数据库作为我的数据库,我有一个第一个表视图,它读取所有数据并将其放在一个很好的tableview中。我的表视图中的每个文档都有一个子集合。当用户按下一行时,我希望它用子集合打开第二个表视图。
这是我对segue代码的准备:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let indexPath = tableViewDishes.indexPathForSelectedRow {
db.collection("Restaurants").document("Applebees").collection("Menu").document(sections[indexPath.section].sectionName!).collection("Dishes").document(sections[indexPath.section].listofDishes![indexPath.row].DishName).collection("Options").getDocuments { (querySnapshot, error) in
if error != nil {print(error)}
else {
for document in querySnapshot!.documents {
//adding all the data to an array called myOption
}
}
}
let selectedDishTableViewController = segue.destination as! SelectedDishViewController
selectedDishTableViewController.myOption = self.myOption
selectedDishTableViewController.dish = self.sections[indexPath.section].listofDishes?[indexPath.row]
selectedDishTableViewController.sectionName = sections[indexPath.section].sectionName!
self.myOption.removeAll()
}
}
问题是,一旦我的代码到达db.collection行,它会立即跳转到for循环之后,当myOption是一个空数组时,它才会返回并将对象附加到我的数组。
这导致我第一次按行获得一个空的第二个表视图,当我返回并再次按下它时,我得到了所需的信息。
答案 0 :(得分:0)
db.collection()做了一些异步工作,所以所有这些代码:
let selectedDishTableViewController = segue.destination as! SelectedDishViewController
selectedDishTableViewController.myOption = self.myOption
selectedDishTableViewController.dish = self.sections[indexPath.section].listofDishes?[indexPath.row]
selectedDishTableViewController.sectionName = sections[indexPath.section].sectionName!
self.myOption.removeAll()
应该在您设置 myOption 数组的for循环之前。这样,一旦数据库检索到所有数据并且你已经在for循环中进行了所有设置,一切都将被设置。
答案 1 :(得分:0)
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let indexPath = tableViewDishes.indexPathForSelectedRow {
db.collection("Restaurants").document("Applebees").collection("Menu").document(sections[indexPath.section].sectionName!).collection("Dishes").document(sections[indexPath.section].listofDishes![indexPath.row].DishName).collection("Options").getDocuments { (querySnapshot, error) in
if error != nil {print(error)}
else {
for document in querySnapshot!.documents {
//adding all the data to an array called myOption
}
let selectedDishTableViewController = segue.destination as! SelectedDishViewController
selectedDishTableViewController.myOption = self.myOption
selectedDishTableViewController.dish = self.sections[indexPath.section].listofDishes?[indexPath.row]
selectedDishTableViewController.sectionName = sections[indexPath.section].sectionName!
self.myOption.removeAll()
}
}
}
}
由于它是异步调用,您可能必须在回调中编写 selectedDishTableViewController segue。
推荐 :Seque委托方法应该简单,不应该处理所有这些db操作尝试优化它。