Заставьте AuthListener дождаться окончания цикла - PullRequest
0 голосов
/ 18 мая 2019

Я читаю данные пользователя при каждом входе в систему.Поскольку у меня есть Firebase AuthListener внутри AppDelegate.swift, представление меняется, как только пользователь вошел в систему.

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

В прошлом я обошел это, добавив: databaseRef.observeSingleEvent(of: .value, with: { snap in ... }) к коду, который меняет представление:

if user != nil && currentCar == "auto auswählen" {
                databaseRef.observeSingleEvent(of: .value, with: { snap in
                    if user?.isAnonymous == false {
                        let controller = storyboard.instantiateViewController(withIdentifier: "RootPageViewController") as! RootPageViewController
                        let vc = storyboard.instantiateViewController(withIdentifier: "ProfileViewController") as! ProfileViewController
                        vc.readTimeline()
                        self.window?.rootViewController = controller
                        self.window?.makeKeyAndVisible()
                    } else if user?.isAnonymous == true {
                        let controller = storyboard.instantiateViewController(withIdentifier: "RootPageViewController") as! RootPageViewController
                        self.window?.rootViewController = controller
                        self.window?.makeKeyAndVisible()
                    }
})

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

databaseRef.child("users").child(uid).observeSingleEvent(of: .value, with: { (snapshot) in
            let value = snapshot.value as? NSDictionary

            for n in 1...snapshot.childrenCount {
                databaseRef.child("users/\(uid)").child(String(n)).observeSingleEvent(of: .value, with: { (snapshot) in
                    let value = snapshot.value as? NSDictionary

                    ...

                }) { (error) in
                    print(error.localizedDescription)
                }
            }
        }) { (error) in
            print(error.localizedDescription)
        }
    }

Как заставить AppDelegate.swift и AuthListener ждатьпока цикл for не закончится?

1 Ответ

0 голосов
/ 18 мая 2019

Вы хотите подождать с переходом к новому представлению, пока все данные не будут загружены.Один из способов сделать это - подсчитать, сколько дочерних узлов уже загружено, а затем продолжить, когда вы загрузите все из них.

В коде, который будет выглядеть примерно так:

databaseRef.child("users").child(uid).observeSingleEvent(of: .value, with: { (snapshot) in
    let value = snapshot.value as? NSDictionary
    let loadedCount = 0

    for n in 1...snapshot.childrenCount {
        databaseRef.child("users/\(uid)").child(String(n)).observeSingleEvent(of: .value, with: { (snapshot) in
            loadedCount = loadedCount + 1
            let value = snapshot.value as? NSDictionary

            ...

            if (loadedCount == snapshot.childrenCount) {
               // TODO: all data is loaded, move to the next view
            }
        }) { (error) in
            print(error.localizedDescription)
        }
    }
}) { (error) in
    print(error.localizedDescription)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...