所以我目前正在开发像Snapchat这样的克隆,我正在向服务器发送拉取请求,但是对于下载,它并不是那么顺利。我创建了一个对此类似的数据库的引用,
var recievers: FIRDatabaseReference{
return mainRef.child("pullRequests")
}
然后我有一个解析数据的viewController(我知道这不是解决这个问题的最好方法,但我现在只是想让它正常工作)并且在那里我有这个
DataService.instance.recievers.observeSingleEvent(of: .value) {(recipients: FIRDataSnapshot) in
if let recipient = recipients.value as? Dictionary<String,AnyObject>{
var index = 0;
for(key,value) in recipient{
index = index+1
if let dict = value as? Dictionary<String,AnyObject>{
if let reciever = dict["recipents"] as? Dictionary<String,AnyObject>{
if let num = reciever["\(index)"] as? String{
let uid = num
recipientsArr.append(uid)
}
}
}
}
}
}
for i in 0...recipientsArr.count{
print(i)
}
我没有收到任何编译错误,但它也没有在recipientsArr中添加任何内容,任何人都可以帮助指导我朝正确的方向发展吗?
我的Firebase看起来像这样:
答案 0 :(得分:0)
问题是您使用方法observeSingleEvent
更新数据库中的值,此方法仅用于从数据库接收数据而不更新。换句话说,它是只读的。
更新firebase数据库中记录的方法与read方法不同。您可以使用setValue
和updateChildValues
两种方法来执行更新。它们都在数据库引用上工作。
要使用setValue
方法,您应该执行以下操作。我假设您已经有一个pullRequests对象,您之前根据从数据库中提取的信息创建了该对象,并将其放在变量中:
let previousRecipents = pullRequests.recipents
let allRecipents = previousRecipents.append(newRecipent) // Assuming preivousRecipents is an array and you have the new Recipent
recievers.child("recipents").setValue(allRecipents)
要使用updateChildValues
,它的工作方式非常相似。
let previousRecipents = pullRequests.recipents
let allRecipents = previousRecipents.append(newRecipent) // Assuming preivousRecipents is an array and you have the new Recipent
let parametersToUpdate = ["recipents": allRecipents]
recievers.updateChildValues(parametersToUpdate)
有关如何更新的更多信息,请查看以下链接: https://firebase.google.com/docs/database/ios/save-data
希望它有所帮助!
答案 1 :(得分:0)
您没有正确解码快照。从你的问题中不清楚你想要观察的价值事件是什么 - 它只是一个新的收件人被添加了吗?整个pullRequest? 在任何情况下,您都在观察pullRequest引用,因此为了解码快照:
if let pullRequest = recipients.value as? Dictionary<String,AnyObject>{
if let recipientsList = pullRequest["recipents"] as? Dictionary<String,AnyObject>{
for (_, value) in recipientsList {
if let uid = value as? String{
recipientsArr.append(uid)
}
}
}
}