gpt4 book ai didi

ios - 如何使用 Firebase 进行多次观察?

转载 作者:行者123 更新时间:2023-11-28 16:00:25 25 4
gpt4 key购买 nike

我需要进行多次观察,但我不知道怎么做。

这是我的数据库结构:

"Posts" : {
"f934f8j3f8" : {
"data" : "",
"date" : "",
"userid" : ""
}
},
"Users" : {
"BusWttqaf9bWP224EQ6lOEJezLO2" : {
"Country" : "",
"DOB" : "",
"Posts" : {
"f934f8j3f8" : true
},
"Profilepic" : "",
"name" : "",
"phonenumber" : ""
}

我想观察帖子并编写代码,效果很好,但我也想获取发布此帖子的用户的姓名,但是当我写保存名称并使用它时,它给了我 null。这是我的代码。

DataServices.ds.REF_POSTS.queryOrderedByKey().observe(.value, 
with: { (snapshot) in

self.posts = []

if let snapshot = snapshot.children.allObjects as? [FIRDataSnapshot] {

for snap in snapshot {

if let postsDict = snap.value as? Dictionary<String, AnyObject> {

let key = snap.key

let userID = "BusWttqaf9bWP224EQ6lOEJezLO2"
DataServices.ds.REF_USERS.child(userID).observeSingleEvent(of: .value, with: { (snapshot) in
let value = snapshot.value as? NSDictionary
let postusername = value?["name"] as? String ?? ""
})
print(" ------ User name : \(postusername) ------")
})

print(" ------ User name 2 : \(postusername) ------")

let post = Posts(postKey: key, postData: postsDict)
self.posts.append(post)

第一个打印语句打印用户名,但第二个打印语句什么都不打印。

提前致谢。

最佳答案

Firebase 是异步的,因此您不能对变量进行操作,直到 Firebase 在其闭包中填充它。此外,代码比互联网更快,因此闭包之后的任何语句都将在闭包内的语句之前发生。

流程如下

Query for the post {
get the user id from the post inside this closure
query for the user info {
create the post inside this second closure
append the data to the array inside this second closure
reload tableview etc inside this second closure
}
}

类似这段编辑过的代码

self.posts = []
myPostsRef.queryOrderedByKey().observe(.value, with: { (snapshot) in


if let snapshot = snapshot.children.allObjects as? [FIRDataSnapshot] {
for snap in snapshot {
if let postsDict = snap.value as? Dictionary<String, AnyObject> {

let key = snap.key

let userID = "BusWttqaf9bWP224EQ6lOEJezLO2"
myUsersRef.child(userID).observeSingleEvent(of: .value, with: { (snapshot) in
let value = snapshot.value as? NSDictionary
let userName = value?["name"] as? String ?? ""
let post = Posts(postKey: key, postData: postsDict, name:userName)
self.posts.append(post)
})
}
}
}
})

您没有在闭包中使用 postusername,所以我将其添加到 Posts 初始化中。

此外,self.posts = [] 将在任何时候在 posts 节点发生变化时重置 posts 数组 - 您可能需要考虑先加载数组,然后观察添加、更改或删除以及只需通过单个更改更新 posts 数组,而不是每次都重新加载整个数组。

编辑:

有人评论说数据在循环外不可用。这是一个非常简化和经过测试的版本。单击按钮 1 会使用一系列字符串填充来自 Firebase 的数组,单击按钮 2 会打印该数组。

var posts = [String]()

func doButton1Action() {

let postsRef = ref.child("posts")
self.posts = []
postsRef.observe(.value, with: { (snapshot) in

if let snapshot = snapshot.children.allObjects as? [FIRDataSnapshot] {
for snap in snapshot {
let value = snap.value as! String
self.posts.append(value)
}
}
})

}

func doButton2Action() {
print(posts)
}

关于ios - 如何使用 Firebase 进行多次观察?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41160364/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com