ios - 无法从 Firebase 正确检索数据

标签 ios swift firebase firebase-realtime-database

这是我尝试从 Firebase 检索代码并使用它做一些事情的第二个版本。这是我用第二种方法完成的:

    channelRef?.observe(.childChanged, with: { (snapshot) -> Void in
        let update = snapshot.value as! Dictionary<String, AnyObject>
        var readyToGoValue: Bool?
        var userID: String?
        var amountOfPlayers: Int?
        var changedCreator: String?
        if let updatedReadyToGo = update["readyToGo"] as! Bool!{
            if updatedReadyToGo == true
            {
                readyToGoValue = true
            }
            else
            {
                readyToGoValue = false
            }
        }
        if let updateduserID = update["userID"] as! String!{
            userID = updateduserID
        }
        if let updatedAmountOfPlayers = update["currentPlayers"] as! Int!{
            amountOfPlayers = updatedAmountOfPlayers
        }
        if let updateduserID = update["userID"] as! String!{
            userID = updateduserID
        }
        if let updatedCreator = update["creator"] as! String!{
            changedCreator = updatedCreator
        }

        let currentUser = FIRAuth.auth()?.currentUser?.uid

        if changedCreator != nil
        {
            print("changed creator")
            self.creator = changedCreator!
        }

此崩溃并显示错误代码:

无法将类型“__NSCFString”(0x10a77f4a0)的值转换为“NSDictionary”(0x10a780288)。在“更新”行。这是我的第一次尝试:

    channelRef?.observe(.childChanged, with: { (snapshot) -> Void in
        let value = snapshot.value as? NSDictionary
        let readyToGoValue = value?["readyToGo"] as? Bool ?? false
        let userID = value?["userID"] as? String ?? ""
        var amountOfPlayers = value?["currentPlayers"] as? Int ?? 0
        let changedCreator = value?["creator"] as? String ?? ""
        print(snapshot)
        let currentUser = FIRAuth.auth()?.currentUser?.uid
        print(changedCreator)
        print(amountOfPlayers)
        if changedCreator != ""
        {
            print("changed creator")
            self.creator = changedCreator
        }

这行不通。在 Firebase 中更改创建者(只是一个字符串)时,我在添加 print(snapshot) 时将其作为打印件获取:

Snap(创作者)嗨

但是 print("changed creator") 永远不会被执行。这是为什么?

编辑:这就是我获得 channelRef 的方式?:

super.prepare(for: segue, sender: sender)
if let channel = sender as? Channel {
    let chatVc = segue.destination as! channelMultiplayerViewController
    chatVc.channel = channel
    chatVc.channelRef = channelRef.child(channel.id)
    chatVc.usersKey = userKey

}

打印更多数据:

        print("path channel ref: " + "\(self.channelRef)")
        print("snapshot: " + "\(snapshot)")
        print("value: " + "\(value)")

-路径 channel 引用:可选(https://X.com/channels/-KeGKaJavH6uPYaSa7k4)

-快照:Snap(creator) new Creator

-值:无

更新:

数据结构:

structure

这暂时可行,但没有更好的方法吗?:

        if snapshot.key == "creator"
        {
            changedCreator = snapshot.value as! String
        }

又一个问题,和上面一模一样,但是有了第一个问题的解法,这个问题就解决不了了。当我尝试获取第一个子节点,即第一个用户,并尝试获取他们的用户 ID 时,没有任何效果。我使用这段代码:

let firstChild = UInt(1)
                    self.channelRef?.queryLimited(toFirst: firstChild).observeSingleEvent(of: .value, with: { (snapshot) in
                        let value = snapshot.value as? NSDictionary
                        print(snapshot)
                        print(value)
                        let newCreator = value?.value(forKey: "userID") as? String

                        if newCreator != nil{
                            print("Got the userID")
                        }
                        if snapshot.key == "userID"
                        {
                            print("Got the userID")
                        }
                    })
Snap (-KeJWMiXaL-FGp0J7b3u) {
    "-KeJWO0V9kxgGnrACAtP" =     {
        PictureVersion = 2;
        readyToGo = 0;
        userID = SZlQ76RLCJQpFa0CDhrgFJoYzrs2;
        username = pietje;
    };
}
Optional({
    "-KeJWO0V9kxgGnrACAtP" =     {
        PictureVersion = 2;
        readyToGo = 0;
        userID = SZlQ76RLCJQpFa0CDhrgFJoYzrs2;
        username = pietje;
    };
})

这会打印出来,所以没有给出用户 ID。为什么是这样?用户ID就在那里!我阅读了文档,但它应该可以工作...

最佳答案

尝试将 chatVc.channelRef = channelRef.child(channel.id) 替换为 chatVc.channelRef = channelRef

关于ios - 无法从 Firebase 正确检索数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42568057/

相关文章:

objective-c - 我可以在 Objective-C 中序列化数组并在反序列化时使其所有值保持不变吗?

ios - iOS 上的 mDNSResponder 错误

ios - 获取地址栏中的 webview URL

firebase - 如何从Firestore中的flutter中的方法访问详细信息

iphone - 在 iOS 等应用程序中创建您自己的文件夹

swift - UICollectionView更改单元格间距

ios - CoreLocation Swift 因后台信号 9 而终止

Swift 4 : Using Swift. 包含检查字符串中是否存在字符

ios - flutter 构建 Xcode : Module 'firebase_analytics' not found

javascript - Firebase 云功能更新并非每次发生写入时都有效