Firebase 获取数据
Posted
技术标签:
【中文标题】Firebase 获取数据【英文标题】:Firebase getting data 【发布时间】:2017-09-09 10:33:58 【问题描述】:我正在尝试在 swift 3 中制作社交应用,并且我正在使用 Firebase。当我尝试制作一个喜欢/不喜欢的系统时,我遇到了问题。所以每个帖子都有这个定义:
Firebase post description
所以我在一个对象数组中检索每个帖子,这些对象的模型类似于数据库中的帖子 (POJO)。我在“信息”组件中也有一些喜欢/不喜欢的嵌套数据,它又是一组定制对象。 问题是我想在遍历所有帖子时初始化这个“信息”对象数组(比如来自关系数据库的联接)。考虑到 Firebase .observe 函数是异步的,我应该如何解决这个问题......这是我的方法:
var postsArray = [Post]()
var userInfoArray = [userInfo]()
func getDataFromServer()
posts.observe(DataEventType.childAdded, with: (snapshot) in
let values = snapshot.value! as! NSDictionary
var postObject = Post()
//getting posts and storing them into an array
postObject.initialize(url: values["image"] as! String, userP: values["user"] as! String, earP: values["ear"] as! Bool, eyeP: values["eye"] as! Bool, textP: values["message"] as! String, uuidP: values["uuid"] as! String, keyP: snapshot.key)
self.keyArray.append(snapshot.key as! String)
self.posts.child("\(postObject.key)").child("info").observe(DataEventType.value, with: (snapshot) in
if let info = snapshot.value as? NSDictionary
var infoForPost = [userInfo]()
for eachEntry in info
//add to an array then set the info value for every post object
infoForPost.append(eachEntry)
postObject.setInfo(infoForPost)
)
self.postsArray.append(postObject)
self.tableView.reloadData()
)
我知道第二个 .observe 函数的代码不起作用,它应该是伪代码。提前致谢!
【问题讨论】:
为什么不在第一次观察闭包中遍历信息?我认为您不需要第二次关闭... 如何在没有其他观察功能的情况下做到这一点? 在第一个观察者中添加print(snapshot.value)
并查看它打印的内容并检查是否也获得了 info 数组?
其实我明白了,但仍然不知道如何访问它
看看我的回答对你有没有帮助?
【参考方案1】:
我猜你只需要观察帖子,因为在你的帖子中你也得到了信息,所以你可以这样做:
posts.observe(DataEventType.childAdded, with: (snapshot) in
if let values = snapshot.value as? [String: Any]
var postObject = Post()
self.keyArray.append(snapshot.key as! String)
if let ceva = values["info"] as? [String: Any]
print(ceva)
postObject.setInfo(infoForPost)
更新:
要获得更多值,您可以这样做:
let values = Array(ceva.values)
for i in 0..<values.count
if let singleValue = values[i] as? [String: Any], let approved = singleValue["Approved"], let disapprove = singleValue["disappreove"]
print(approved)
print(disapprove)
【讨论】:
pastebin.com/0mWjYHEj 输出只有:“ccc”我的帖子数 @adiveli 如果您将[[String: Any]]
替换为Any
然后尝试打印信息
“Type Any 不符合协议序列”错误
没有输出:(
好的,让我们做更多的调试,你能在firebase中显示你在哪里输入这个信息的代码以上是关于Firebase 获取数据的主要内容,如果未能解决你的问题,请参考以下文章
无法从 firebase 回收器视图中的 firebase 实时数据库中获取嵌套数据