【发布时间】: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