我在ViewDidLoad
运行一个从Firebase获取字符串数组的函数(包含'autoIds'列表),然后我将这个检索到的数组附加到一个变量中,在Vc中初始化。我想在ViewWillAppear
中运行的另一个函数中使用此数组的计数,但是尽管成功检索了数据,但变量count不会显示在ViewDidLoad
或ViewWillAppear
中,并且将它附加到变量。我花了两天时间研究和调查最好的部分 - 我确信我找不到答案,因为它是如此明显!这是我的代码:
var totalPosts = [String]
我在ViewDidLoad
中调用的函数如下: -
func calcTotalPosts() {
let uid = Auth.auth().currentUser?.uid
let ref = DB_BASE.child("user-posts").child(uid!)
ref.observe(.childAdded, with: { (snapshot) in
let postId = snapshot.key
self.totalPosts.append(postId)
print(self.totalPosts)
}
}
我知道Firebase检索的工作方式与打印时一样,我可以看到所有正确的autoId,但是当我使用相同的print语句在ViewWIllAppear
中检查时,数组为空。
任何帮助 - 非常感谢!!
答案 0 :(得分:1)
您遇到的问题是您对Firebase的请求是异步的,可能需要一些时间才能完成。
那时你的viewWillAppear
功能已经运行了。
订单是这样的......
如果要使用数组中的值来填充视图,则需要响应正在更新的数组。
我建议在阵列上使用didSet
...
// this is a property on the class (like it is already) but with a didSet on it
var totalPosts: [String] = [] {
didSet {
// this is a new function that updates the view based on the values in the array
// e.g. this might populate a label or update a table view
updateViewWithNewArrayValues()
}
}
现在您可以创建此函数,每次数组更改时都会调用它。并且不依赖于Firebase请求需要多长时间。
您的提取功能将保持不变。但现在在行{... self.totalPosts.append(postId)
中它现在将触发didSet
在阵列上运行并导致视图更新。
您不再需要依赖完成功能的时间。对阵列的任何更新都将触发视图更新。