【问题标题】:Can not retrieve data correctly from Firebase无法从 Firebase 正确检索数据
【发布时间】:2017-07-22 22:11:39
【问题描述】:

这是我的第二个版本,我试图从 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)")

-路径通道参考:可选(https://X.com/channels/-KeGKaJavH6uPYaSa7k4

-snapshot:快照(创建者)新的创建者

-值:无

更新:

数据结构:

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

        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就在那里!我阅读了文档,但它应该可以工作......

【问题讨论】:

  • 能否包含设置channelRef? 变量的行?
  • 可能你给它的路径在你的数据库结构中太深了一层,比如"some_collection/an_object/readyToGo"而不是"some_collection/an_object",这可以解释为什么snapshot被作为字符串返回字典的
  • 我编辑了这个问题。将数据更改为我认为的字典时出现问题

标签: ios swift firebase firebase-realtime-database


【解决方案1】:

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

【讨论】:

  • 这样它将观察频道中的每个房间,它需要观察1个频道。该频道由 channel.id 识别,因此我认为该部分正在工作。
  • 我知道你的意思,但是这样每个房间里的每个人都在观察每个房间。我希望那个房间里的每个人都只是观察那个唯一的房间。从该字典中获取值有问题。当该房间频道中的地图发生变化时(我的用户中有一个单独的地图),该值不为零。
  • 我知道您在问题的末尾包含了一个数据结构示例,但您能否也包含它在 Firebase 数据库中的样子?因为路径 channels/channel-id 需要至少有一个键/值对才能转换为字典
  • 我更新了问题。如您所见,我有一些键和一些值。但无论我尝试什么,它都不会获取 key >:( 的值
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-25
相关资源
最近更新 更多