这是我尝试从 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
-值:无
更新:
数据结构:
这暂时可行,但没有更好的方法吗?:
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/