Наблюдатель тратит время, поэтому код пропускает его и приводит к тому, что флаг равен нулю - PullRequest
0 голосов
/ 11 февраля 2020

Я создал функцию, которая возвращает логическое значение, однако наблюдателю требуется время для подключения, в результате чего код пропускает его, он печатает оператор печати с сообщением, что флаг равен нулю, а затем вводит отпечатки в наблюдателе. Есть ли способ исправить это?

    func HidingHim(idlabel:String) -> Bool{
    var flag:Bool?
    var d = Database.database().reference().child("Users").child(idlabel).child("hidingUser")

    var h = d.observeSingleEvent(of: .value) { (snapshot) in
         if(snapshot.hasChild(Auth.auth().currentUser!.uid)){
            flag = true
            print("flag in observer is true")

         }else{
         flag = false
            print("flag in observer is false")
         }
    }
       print("flag is \(flag!)")
    return flag!


}

1 Ответ

1 голос
/ 11 февраля 2020

Ваша функция синхронная, но, похоже, observeSingleEvent имеет асинхронный обратный вызов. Вам, по крайней мере, нужно дождаться этого обратного вызова, что означает, что вы не можете вернуть Bool синхронно, а вместо этого используете асинхронный обратный вызов, который вы можете указать в сигнатуре функции, например, func HidingHim(idlabel: String, completion: @escaping (_ flag: Bool) -> Void)

Внутри своего наблюдателя. В завершение вы можете вызвать completion с соответствующим значением Bool.

Что-то вроде

func hidingHim(idlabel: String, completion: @escaping (_ flag: Bool) -> Void) {

    var d = Database.database().reference().child("Users").child(idlabel).child("hidingUser")

    var subscription = d.observeSingleEvent(of: .value) { (snapshot) in
         if(snapshot.hasChild(Auth.auth().currentUser!.uid)){
            completion(true)

         } else {
             completion(false)
         }
    }
}

В зависимости от того, как выглядит ваша наблюдаемая реализация, вам может потребоваться удержаться на subscription, возвращенном при вы наблюдаете SingleEvent, чтобы он не умер до того, как соблюдает какие-либо значения. Если ваше завершение никогда не называется, вот почему. затем вам нужно вернуть подписчика и сохранить его где-нибудь, чтобы сохранить подписку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...