FireiftDatabase在Swift中查询问题

时间:2017-02-12 19:04:46

标签: ios swift firebase firebase-realtime-database

所以我目前正在开发像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看起来像这样:

2 个答案:

答案 0 :(得分:0)

问题是您使用方法observeSingleEvent更新数据库中的值,此方法仅用于从数据库接收数据而不更新。换句话说,它是只读的。

更新firebase数据库中记录的方法与read方法不同。您可以使用setValueupdateChildValues两种方法来执行更新。它们都在数据库引用上工作。

要使用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)
                        }
                    }
                }
            }