结构数组在闭包之外没有更新
Posted
技术标签:
【中文标题】结构数组在闭包之外没有更新【英文标题】:Array of struct not updating outside the closure 【发布时间】:2017-05-26 07:54:37 【问题描述】:我有一个名为 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
任何帮助将不胜感激!
【问题讨论】:
【参考方案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
)
【讨论】:
调用reload data方法后,解决了我的问题 太好了。继续质疑。 (提出答案接受,所以下次其他人可以直接解决问题。)@packability 如果你认为你解决了你的问题,只需点击我回答的向上箭头。 @packability【参考方案2】: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()
【讨论】:
感谢您的回答!但我收到一条错误消息,说模块“Dispatch”没有名为 main 的成员 @packability 是DispatchQueue.main.async
@Sorry 拼写错误。更新了答案。以上是关于结构数组在闭包之外没有更新的主要内容,如果未能解决你的问题,请参考以下文章