Потому что наблюдаю за работой асинхронно, и вы печатаете users.count перед обновлением массива users ...

учаю снимок всех пользователей в моей базе данных Firebase. После того, как я добавляю всех моих пользователей из моего узла «users» в моей базе данных в массив пользователей, я пытаюсь напечатать количество пользователей (которое должно быть 12), и вместо этого появляется 0.

Я добавил точку останова в закрывающей скобке оператора if, которая показывает мне, что число пользователей достигает 12. Однако к тому времени, когда приходит время печатать это число, оно равно нулю. Проходя через кучу раз, это просто много ассемблерного кода, который мне ничего не говорит.

Я вызываю эту функцию в методе viewDidLoad () и пытаюсь напечатать счетчик пользователей после вызова этой функции, в дополнение к печати ее внутри функции, и она по-прежнему равна 0.

func getUsers() {

    let ref = Database.database().reference().child("users")

    ref.observe(.childAdded, with: { (snapshot) in
        if let dictionary = snapshot.value as? [String: AnyObject] {

            let user = User()

            user.id = snapshot.key
            user.setValuesForKeys(dictionary)                
            self.users.append(user)
        }

    }, withCancel: nil)

    print(users.count)
}

Ответы на вопрос(2)

и вы печатаете users.count перед обновлением массива users ...

Решение Вопроса

получение данных занимает некоторое время, поскольку оно асинхронное.

func getUsers(completionHandler:@escaping (Int) -> ()){

    let ref = Database.database().reference().child("users")

    ref.observe(.childAdded, with: { (snapshot) in
        if let dictionary = snapshot.value as? [String: AnyObject] {

            let user = User()

            user.id = snapshot.key
            user.setValuesForKeys(dictionary)
            self.users.append(user)
            completionHandler(self.users.count)
        }
    })

override func viewDidLoad() {
    super.viewDidLoad()
    getUsers(){ (count) in
        print(count)
    }
}

То, что происходит, довольно просто, я просто добавил обработчик завершения.

 J. Doe11 сент. 2017 г., 08:40
@evanhaus, вы должны использовать для этого visibleSingle, а не ребенка. Добавленный ребенок будет продолжать работать, вы не сможете сказать, что он завершил загрузку всех данных в базу данных.
 evanhaus11 сент. 2017 г., 02:08
Большой! Это печатает числа от 0 до общего числа пользователей. Поскольку я не знаком с этим синтаксисом, как бы я назначил окончательное число глобальной переменной. Что-то вродеlet userCount = getUsers()

Ваш ответ на вопрос