我正在使用Firebase处理应用程序。我想要完成的是从Firebase获取数据,对数据进行排序,然后最终将数据加载到tableView中。
我不会分享我的整个代码,但这基本上就是我希望它如何运作:
var posts = [PostStruct]()
var following = [String]()
...
let databaseRef = FIRDatabase.database().reference()
for follower in following {
databaseRef.child("Posts").child(follower).observe(.value, with: {
DataSnapshot in
//Parse All The Data...
self.posts.insert(...)
}
}
self.posts.sort{$0.date.compare($1.date) == .orderedDescending}
print("Test")
self.tableView.reloadData()
调用print("Test")
,但在请求FIRDatabase之前调用它,这样就告诉我tableView在排序时绝对没有数据。所以,我需要找到一种只在数据库完成请求后才进行排序的方法。
我可以将sort和reload方法放在for语句中,这样可行,但它会使所有内容变得不稳定,而且效率不高。
答案 0 :(得分:2)
不确定这是否是处理此问题的最佳方法,但您可以添加一个递增的计数器,然后在该计数器等于以下数组的计数后执行排序和重新加载代码。
var counter = 0
let databaseRef = FIRDatabase.database().reference()
for follower in following {
databaseRef.child("Posts").child(follower).observe(.value, with: {
DataSnapshot in
//Parse All The Data...
counter += 1
self.posts.insert(...)
if counter == following.count {
self.sortPosts()
}
}
}
func sortPosts() {
self.posts.sort{$0.date.compare($1.date) == .orderedDescending}
print("Test")
self.tableView.reloadData()
}
答案 1 :(得分:1)
如果这是针对您的youtube教程,我将尝试回答
我认为Donny的解决方案会起作用,你也可以通过回调函数来实现这一点
func getData(handle:@escaping ((Bool) -> Void)){
let databaseRef = FIRDatabase.database().reference()
for follower in following {
databaseRef.child("Posts").child(follower).observe(.value, with: {
DataSnapshot in
//Parse All The Data...
counter += 1
self.posts.insert(...)
if counter == following.count {
handle(true)
}
}
}
}
然后在你调用getData的方法中。
getData(){ ready in
self.posts.sort{$0.date.compare($1.date) == .orderedDescending}
print("Test")
self.tableView.reloadData()
}