使用准备segue传输数据

时间:2017-11-24 13:05:36

标签: ios swift firebase google-cloud-firestore

我是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是一个空数组时,它才会返回并将对象附加到我的数组。

这导致我第一次按行获得一个空的第二个表视图,当我返回并再次按下它时,我得到了所需的信息。

2 个答案:

答案 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操作尝试优化它。