Невозможно передать завершенный массив через обработчик завершения или любым другим способом, используя метод наблюдения Firebase - PullRequest
0 голосов
/ 22 сентября 2018

Когда я пытаюсь использовать обработчик завершения для передачи массива данных из базы данных Firebase, используя метод наблюдений, он пропускает только первый элемент в базе данных (или ни одного вообще, когда я пытаюсь использовать другие способы).Единственный способ, который я нашел, который работает для передачи массива всех данных в базе данных Firebase, это использование таймера, что является плохой практикой.Как передать завершенный массив данных в базу данных Firebase?

Вот мой код:

func loadHighScore(completionHandler:@escaping (_ scoresArray: [User]?)->()) {
    ref.child("Scores").observe(.childAdded, with: { (snapshot) in
        var scoresArray:[User] = []
        let dictionary = snapshot.value as? [String: AnyObject] ?? [:]
        let username = dictionary["Username"] as? String ?? ""
        let score = dictionary["High Score"] as? Int ?? 0
        let user = User(username: username, highScore: score)
        scoresArray.append(user)
        completionHandler(scoresArray)
    }, withCancel: {(err) in
        print("Error downloading profile: \(err)")
        completionHandler(nil)
    })
}

Я называю эту функцию следующим образом:

Firebase.sharedInstance.loadHighScore() { users in
    guard let users = users else { return }
    print("users: \(users)")
    self.sortedUsers = users.sorted {
        $0.highScore > $1.highScore
    }
    self.tableView.reloadData()
}

Консоль показывает, что за один раз печатается один пользователь, а не массив пользователей.В табличном представлении отображается только один пользователь, а не все.Когда я пытаюсь использовать цикл for с обработчиком завершения, вызываемым вне цикла for, я получаю сообщение о том, что не могу использовать цикл for in.

Как мне обойти использование таймераполучить законченный массив, переданный в функцию, которая вызывает мою функцию наблюдения Firebase?

1 Ответ

0 голосов
/ 22 сентября 2018

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

 func loadHighScore(completionHandler:@escaping (_ scoresArray: [User]?)->()) {
        ref.child("Scores").observe(.value, with: { (snapshot) in
            var scoresArray:[User] = []
            for userSnap in snapshot.children {
                 guard let userSnapshot = userSnap as? FIRDataSnapshot else { 
                     return completion(scoresArray) // this will be empty array
                 }
                 let dictionary = userSnapshot.value as? [String: AnyObject] ?? [:]
                 let username = dictionary["Username"] as? String ?? ""
                 let score = dictionary["High Score"] as? Int ?? 0
                 let user = User(username: username, highScore: score)
                 scoresArray.append(user)
            }
            completionHandler(scoresArray)
        }, withCancel: {(err) in
            print("Error downloading profile: \(err)")
            completionHandler(nil)
        })
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...