我有一个名为displayStruct
的结构数组struct displayStruct{
let price : String!
let Description : String!
}
我正在从firebase读取数据并将其添加到我的结构数组myPost中,该结构在下面初始化
var myPost:[displayStruct] = []
我创建了一个函数,将数据库中的数据添加到我的结构数组中,如此
func addDataToPostArray(){
let databaseRef = Database.database().reference()
databaseRef.child("Post").queryOrderedByKey().observe(.childAdded, with: {
snapshot in
let snapshotValue = snapshot.value as? NSDictionary
let price = snapshotValue?["price"] as! String
let description = snapshotValue?["Description"] as! String
// print(description)
// print(price)
let postArr = displayStruct(price: price, Description: description)
self.myPost.append(postArr)
//if i print self.myPost.count i get the correct length
})
}
如果我打印myPost.count,在这个闭包内我得到正确的长度但是在这个函数之外如果我打印长度我得零,即使你全局声明数组(我认为)
我在viewDidLoad方法
中调用了这个方法 override func viewDidLoad() {
// setup after loading the view.
super.viewDidLoad()
addDataToPostArray()
print(myPeople.count) --> returns 0 for some reason
}
我想在tableView
的功能下使用该长度是我的方法public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return myPost.count --> returns 0
}
任何帮助将不胜感激!
答案 0 :(得分:1)
Firebase observe
对数据库的调用是asynchronous
,这意味着当您请求该值时,它可能无法获取,因为它可能正在获取它。
这就是为什么您count
的两个查询都会在viewDidLoad
和DataSource delegeate
方法中返回0。
databaseRef.child("Post").queryOrderedByKey().observe(.childAdded, with: { // inside closure }
在闭包内部,代码已经执行,因此您拥有值。
您需要做的是需要在闭包内的主线程中重新加载Datasource
。
databaseRef.child("Post").queryOrderedByKey().observe(.childAdded, with: {
// After adding to array
DispatchQueue.main.asyc {
self.tableView.reloadData()
}
}
答案 1 :(得分:1)
您在关闭内部进行异步网络请求,并且编译器不会等待响应,因此在获取发布数据时只需重新加载表。用下面的代码替换它可以正常工作。一切顺利。
func addDataToPostArray(){
let databaseRef = Database.database().reference()
databaseRef.child("Post").queryOrderedByKey().observe(.childAdded, with: {
snapshot in
let snapshotValue = snapshot.value as? NSDictionary
let price = snapshotValue?["price"] as! String
let description = snapshotValue?["Description"] as! String
// print(description)
// print(price)
let postArr = displayStruct(price: price, Description: description)
self.myPost.append(postArr)
print(self.myPost.count)
print(self.myPost)
self.tableView.reloadData()
//if i print self.myPost.count i get the correct length
})
}