Swift Firebase 在闭包内发送数据

Swift Firebase sending data inside a closure

我正在尝试将数据发送到另一个视图控制器。但是,无法在第二个视图控制器访问数据。这是我的代码:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    super.prepare(for: segue, sender: sender)


    switch(segue.identifier ?? "") {

    case "tograddetail":
        print("Going to Grad Detail")


        guard let gradDetailViewController = segue.destination as? graduatedetailViewController else {
            fatalError("Unexpected destination: \(segue.destination)")
        }

        guard let selectedgradCell = sender as? GradTableViewCell else {
            fatalError("Unexpected sender: \(sender)")
        }

        guard let indexPath = tableView.indexPath(for: selectedgradCell) else {
            fatalError("The selected cell is not being displayed by the table")
        }


        ref = FIRDatabase.database().reference().child("Database")
        ref.observe(FIRDataEventType.value, with: { (snapshot) in

            //print(snapshot.value)
            if snapshot.exists() {
                if let countdowntime = snapshot.value as? NSDictionary {

                    let selectedgrad = self.graduatename[indexPath.row]

                    if let graddata = countdowntime[selectedgrad] as? NSDictionary {

                        let theinstitution = graddata["Institution"] as! String
                        let thelocation = graddata["location"] as! String
                        let thetimeleft = graddata["timeleft"] as! Int

                        guard let firstgrad = graddetail(institution: theinstitution, location: thelocation, timeleft: thetimeleft) else {
                            fatalError("Unable to instantiate graddetail")
                        }
                        //print(firstgrad.institution)

                        //print(destinationgraddata.grad?.institution)



                        let destinationVC = segue.destination as! graduatedetailViewController
                        destinationVC.grad = firstgrad


                    }

                }
            }
        })

    default:
        fatalError("Unexpected Segue Identifier; \(segue.identifier)")
    }
}

这是我的第二个视图控制器的代码:

var grad: graddetail?

@IBOutlet weak var theinstitution: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()

    if let grad = grad {

        theinstitution.text = grad.institution

    }
}

但是,grad.institution 值总是 return 零。有什么想法吗?

问题是 observe(_:with:) 是异步的,segue 将同步调用,因此当您在 observe 的完成块中获得响应时,您的 segue 已经执行。

要解决此问题,您需要做的是在调用 performSegue 之前调用 observe 并在 observe 的完成块内当您收到响应时调用 perfromSegue 与您要传递的值。