Firebase数据库,为什么之前打印firebase代码的打印行?

时间:2018-01-26 19:54:18

标签: swift firebase-realtime-database

按下按钮时,执行以下代码。并在控制台中打印出来。

  1. 3

  2. 2

  3. 当前患者ID:2

    新患者ID:3

    因为您可以明显看到generateID()print("2. \(patient.id)")之前被触发,因此它应该在控制台中打印,如下所示:

    1. 3
    2. 当前患者ID:2

      新患者ID:3

      1. 3
      2. 有什么不对? 我是新人,感谢任何帮助。

        @IBAction func buttonPressed(_ sender: UIButton) {
            let patientDatabaseReference = Database.database().reference().child("Patients")
        
            print("1. \(patient.id)") // patient.id is naturally set to 3.
        
            patient.id = "2"
        
            patientDatabaseReference.observe(.value, with: { (snapshot) in
        
                for childSnap in  snapshot.children {
                    guard let childSnapshot = childSnap as? DataSnapshot else {
                        continue
                    }
        
                    if childSnapshot.key == self.patient.id {
                        self.generateID() // I have made sure that this line gets executed.
                    }
        
                }
            })
        
        print("2. \(patient.id)")
        
        }
        

        //

        func generateID() {
        
            let numberOfPatientsReference = Database.database().reference(withPath: "NumberOfPatients")
            numberOfPatientsReference.observeSingleEvent(of: .value, with: { snapshot in
        
                if !snapshot.exists() {
                    return
                }
        
                self.patient.id = "\(snapshot.value!)"
        
                print("Current Patient ID: \(self.patient.id)")
        
                var intPatientID = Int(self.patient.id)!
                intPatientID += 1
                self.patient.id = "\(intPatientID)"
        
                print("New Patient ID: \(self.patient.id)")
        
            })
        }
        

1 个答案:

答案 0 :(得分:1)

代码是异步的。这意味着当观察块与网络通信时将发生打印行。如果将print语句放在observe代码块中,它将按照您期望的方式工作。