Swift Firebase при получении данных из базы данных, как отложить следующий код, пока поиск не будет завершен? - PullRequest
0 голосов
/ 23 января 2019

Я работаю с базой данных Firebase Real Time, и у меня возникают проблемы с выполнением кода в определенное время. Когда я спрашиваю базу данных, есть ли в ней определенное значение, она выполняет код для извлечения данных, но затем автоматически переходит к следующей строке, не ожидая извлечения данных. Я использую этот код для извлечения данных:

self.ref.child("Period \(periodListValue)").child("Students").child("\(studentName)").child("Novel Author").observeSingleEvent(of: .value) { (snapshot) in

      self.CurrentAuthorTextField.text = (snapshot.value as! String)

}

Строка кода прямо под этой строкой, которая не связана с базой данных, выполняется сразу после выполнения кода выше. Это означает, что я не могу использовать какую-либо информацию базы данных кода прямо под показанным выше.

Я пытаюсь объяснить это так же хорошо, как и я.

Любая помощь?

Ответы [ 3 ]

0 голосов
/ 23 января 2019

Причина, по которой вы можете столкнуться с этой проблемой, связана с неверными правилами безопасности базы данных.Это может легко помешать вам получить нужные данные и синхронизировать базу данных в реальном времени.

Предположим, вы пытаетесь синхронизировать ссылку на базу данных ref.Вам нужно установить правильные правила , которые позволяют читать из этой ссылки на базу данных - что-то вроде ".read" = true".

[Предупреждение] Пожалуйста, будьте осторожны с этими правилами безопасности базы данных,Неправильные правила могут привести к крайне нежелательному поведению, например, к людям, незаконно читающим и / или пишущим из / в вашу базу данных.Хорошее видео о том, как установить безупречные правила безопасности, - Ключ к безопасности на основе firebase - Google I / O 2016

0 голосов
/ 23 января 2019
let dispatch = DispatchGroup.init()
dispatch.enter()

self.ref.child("Period \(periodListValue)").child("Students").child("\(studentName)").child("Novel Author").observeSingleEvent(of: .value) { (snapshot) 
in

    self.CurrentAuthorTextField.text = (snapshot.value as! String)
    dispatch.leave()
}

dispatch.notify(queue: .main) {
    //write code here, it will execute after database fetch             
}
0 голосов
/ 23 января 2019

Ну, вы должны использовать обработчик завершения для: -

func ifStudentPresent(studentName: String, completionHandler: @escaping ((_ exist : Bool) -> Void)) 
{
      self.ref.child("Period \(periodListValue)").child("Students").child("\ . 
      (studentName)").child(studentName).observeSingleEvent(of: .value) { (snapshot) in
      if snapshot.exists(){
                completionHandler(true)
            }else{
                print("Student Don't exist")
                completionHandler(false)
            }
        })
  }
...