swift - 无法使用 Firebase 观察方法通过完成处理程序或任何其他方式传递已完成的数组

标签 swift firebase firebase-realtime-database

当我尝试使用完成处理程序通过观察方法从 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()
}

控制台显示一次打印一个用户,而不是一组用户。 TableView 仅显示一个用户而不是所有用户。当我尝试将 for in 循环与在 for in 循环外部调用的完成处理程序一起使用时,我收到一条关于如何无法使用 for in 循环的错误。

如何使用计时器来获取传递给调用我的观察 Firebase 函数的函数的完整数组?

最佳答案

您似乎只访问快照上的一个用户,因此请尝试下面的代码

 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)
        })
    }

关于swift - 无法使用 Firebase 观察方法通过完成处理程序或任何其他方式传递已完成的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52458469/

相关文章:

ios - 删除UITableViewCell并与Plist同步

swift - 匹配 Swift 中全文搜索的所有标记

ios - Swift firebase 快照在数据存在时返回 null

java - 在 firebase (JAVA) 中插入字符串变量作为键(子)

ios - 如何将用户名和电子邮件保存到 firebase

ios - 快速折叠一行上的 tableView 行选择

ios - Swift,按钮部分在 View 之外,我不会处理事件

ios - 在同一 uitableview 中显示两个不同的自定义单元格 - swift firebase

firebase - 如何在flutter中访问firestore的某些字段?

java - onMarkerClick 内的 Firebase 查询无法正常工作