Обработчик вызывается раньше, чем цикл завершает обработку snasphot Firebase в быстром, почему? - PullRequest
0 голосов
/ 25 октября 2018

Мне нужна помощь, у меня есть следующий код, который является частью функции, которая запрашивает и возвращает snapshot пользовательских данных из Firebase.Я пытаюсь перебрать snapshot, передавая его вспомогательному filterDiscoveredUserByPreferences методу, который помогает фильтровать вход / выход, затем предполагается добавить объект в массив, чтобы он мог быть передан обратно через handler.

Проблема в том, что мой handler вызывается слишком рано, прежде чем цикл for завершится со снимком, возвращенным из Firebase.Я пытался использовать distpatchQueue, но это не сработало.

self.getUsersAtVenueHandle = self.REF_USERS.observe(.value, with: { (snapshot) in

                    guard let usersSnapshot = snapshot.children.allObjects as? [DataSnapshot] else { return }


                        for user in usersSnapshot{
                            // Code here to get all values from ‘user’ snapshot the create User object

                            let user = User(uid: uid, dictionary: dictionary)

                            if user.discoverable == true && user.uid != Auth.auth().currentUser?.uid {

                                self.filterDiscoveredUserByPreferences(discoveredUser: user, handler: { (success) in

                                    if success {
                                        users.append(user)
                                    }

                                })//filterDiscoveredUserByPreferences

                            }//end if

                        }//end for

                        //handler gets called before for loops has finished processing the entire snapshot

                        handler (users, true)
                        users.removeAll()


                }, withCancel: { (error) in
                    print(error)

                })//end Firebase call

Функция: filterDiscoveredUserByPreferences

func filterDiscoveredUserByPreferences(discoveredUser: User, handler: @escaping (Bool) -> ()){

    let discoveredGender = discoveredUser.gender
    let discoveredPrefs: [String : Any] = discoveredUser.discoveryPrefs
    let discoveredPreferMen = discoveredPrefs["men"] as? Bool
    let discoveredPreferWomen = discoveredPrefs["women"] as? Bool

    var discoveredPreferredGender: String?

    switch (discoveredPreferMen, discoveredPreferWomen) {

    case (true, true):
        discoveredPreferredGender = "both"

    case (true, false):
        discoveredPreferredGender = "female"

    case (false, true):
        discoveredPreferredGender = "male"

    case (false, false):
        discoveredPreferredGender = "not discoverable"

    default:
        break
    }//end switch


    getUserInfo(forUserId: (Auth.auth().currentUser?.uid)!) { (user) in

        let myGender = user.gender
        let myDiscoveryPrefs: [String : Any] = user.discoveryPrefs
        let myPreferMen = myDiscoveryPrefs["men"] as? Bool
        let myPreferWomen = myDiscoveryPrefs["women"] as? Bool


        switch (myPreferWomen, myPreferMen) {

        case (true, true): //both

            switch myGender {

            case "male":

                switch(discoveredPreferredGender){

                case "male":
                    handler(true)

                case "female":
                    handler(false)

                case "both":
                    handler(true)

                case "not discoverable":
                    handler(false)

                default:
                    break

                }//end switch

            case "female":

                switch(discoveredPreferredGender){

                case "male":
                    handler(false)

                case "female":
                    handler(true)

                case "both":
                    handler(true)

                case "not discoverable":
                    handler(false)

                default:
                    break

                }//end switch

            default:
                break

            }//end switch



        case (true, false)://female only

            if discoveredGender == "male"{
              handler(false)
            } else {

                switch(discoveredPreferredGender){

                case "male":
                    handler(true)

                case "female":
                    handler(false)

                case "both":
                    handler(true)

                case "not discoverable":
                    handler(false)

                default:
                    break

                }//end switch

            }//end else

        case (false, true): //male only

            if discoveredGender == "female"{
                handler(false)
            } else {

                switch(discoveredPreferredGender){

                case "male":
                    handler(true)

                case "female":
                    handler(false)

                case "both":
                    handler(true)

                case "not discoverable":
                    handler(false)

                default:
                    break

                }//end switch

            }//end else

        case (false, false): //none

            handler(false)

        default:
            break
        }


    }//end getLoggedinUserDetails


}//end fun

Func getUserInfo

func getUserInfo(forUserId: String, currentUserHandler: @escaping (_ currentUser: User) -> ()){

    REF_USERS.child(uid).observe(.value, with: { (snapshot) in

        guard let dict = snapshot.value as? [String: Any] else { return }

        let user = User(uid: uid, dictionary: dict)

        currentUserHandler(user)

    }) { (error) in
        print(error)
    }

}//end func

1 Ответ

0 голосов
/ 25 октября 2018

Это асинхронный обратный вызов, он будет вызываться несколько раз, в зависимости от обновлений.Если вы используете точки отладки для проверки этого, вы можете запутаться.Напишите консольный журнал в начале и конце закрытия observe(.value, with: { (snapshot) }, и вы поймете ход.Невозможно вызвать обработчик до завершения цикла for.Это может быть ваш первый обратный вызов имеет большое количество записей, а второй обратный вызов имеет ноль DataSnapshot s

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